Programming/MSSQL
MSSQL 페이지 위치 쿼리
장형이
2023. 2. 2. 23:55
작업 중에 MSSQL에서 현재 데이터가 어떤 페이지(물리적 페이지)에 있는지 알아야 하는 일이 있었는데, 그때 사용한 쿼리들을 정리하였다.
1. 테이블의 Page 현황 조사 쿼리
SELECT DB_NAME(PA.database_id) [DataBase],
OBJECT_NAME(PA.object_id) [Table], SI.Name [Index],
is_allocated, allocated_page_file_id [file_id],
allocated_page_page_id [page_id], page_type_desc,
page_level, previous_page_page_id [previous_page_id],
next_page_page_id [next_page_id]
FROM sys.dm_db_database_page_allocations
(DB_ID('데이터베이스명'),
OBJECT_ID('테이블명'),NULL, NULL, 'DETAILED') PA
LEFT OUTER JOIN sys.indexes SI
ON SI.object_id = PA.object_id
AND SI.index_id = PA.index_id
ORDER BY page_level DESC, is_allocated DESC,
previous_page_page_id
테이블의 페이지 리스트를 볼 수 있다.
2. row 별 PageId 구하기
-- row 별 pageId를 구한다.
SELECT plc.*, c.*
FROM [dbo].[테이블명] as c (nolock)
CROSS APPLY sys.fn_physLocCracker (%%physloc%%) As plc
GO
해당 쿼리는 2008 버전에서 구현된 쿼리로 보이며 최신 버전에서는 가끔씩 제대로 된 page_id를 뱉지 않을 수도 있다.
하지만 page_id가 변화하는 구간은 확실히 알 수 있어서 자주 참고하였다.
3. PageId로 row 구하기
DBCC TRACEON(3604)
dbcc page ( DB명, 인덱스Id, 페이지Id, 옵션)
--ex. dbcc page ( Main, 1, 470, 3)
이번엔 반대로 위에서 구한 pageId로 uid:7039의 데이터를 찾아 보았다.
옵션은 0: 헤더, 1: 행, 2: 페이지, 3: 행과 칼럼인데, 왠만하면 3 말곤 쓸 일이 없다.