특정 테이블에 대한 ROW_OVERFLOW_DATA 페이지를 나열하십시오.


11

ROW_OVERFLOW_DATA 행이있는 테이블의 페이지 목록을 가져 오려고합니다. 문서화되지 않은 DMV에서 할당 된 페이지 목록을 얻을 수 sys.db_db_database_page_allocations있지만 해당 DMV의 출력에 ROW_OVERFLOW_DATA 페이지가없는 것 같습니다. 내가 찾을 수없는 다른 DMV가 있습니까?

최소한의 완전하고 (희망적으로!) 검증 가능한 예 :

USE tempdb;

IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL
DROP TABLE dbo.t;
GO

CREATE TABLE dbo.t
(
    rownum int NOT NULL IDENTITY(1,1)
        PRIMARY KEY CLUSTERED
    , on_row_data varchar(30) NOT NULL
        DEFAULT ('on_row_data')
    , off_row_data varchar(MAX) NOT NULL
        DEFAULT REPLICATE('A', 20000) --PLENTY BIG ENOUGH!
) WITH (DATA_COMPRESSION = NONE); --not compressing those pages!

INSERT INTO dbo.t DEFAULT VALUES;

DECLARE @ObjectID int = (SELECT o.object_id FROM sys.objects o WHERE o.name = 't');
DECLARE @PageID int;
DECLARE @PageTypeDesc varchar(100);

SELECT FileID = dpa.allocated_page_file_id
    , PageID = dpa.allocated_page_page_id
    , PageTypeDesc = dpa.page_type_desc
FROM sys.dm_db_database_page_allocations(DB_ID(), @ObjectID, NULL, NULL, 'DETAILED') dpa

출력은 다음과 같습니다.

╔ ========= ╦ ========= ╦ ================
FileID ║ PageID ║ PageTypeDesc ║
╠ ========= ╬ ========= ╬ ================
║ 1 ║ 1598 ║ IAM_PAGE ║
║ 3 ║ 105368 ║ DATA_PAGE ║
║ 3 ║ 105369 ║ NULL ║
║ 3 ║ 105370 ║ NULL ║
║ 3 ║ 105371 ║ NULL ║
║ 3 ║ 105372 ║ NULL ║
║ 3 ║ 105373 ║ NULL ║
║ 3 ║ 105374 ║ NULL ║
║ 3 ║ 105375 ║ NULL ║
╚ ========= ╩ ========= ╩ ================

누락 된 ROW_OVERFLOW_DATA 페이지 이외의 의미가 있습니다. 우리는 단일 인덱스 할당 맵 페이지와 8KB 데이터 페이지의 전체 범위 범위를 가지며, 그 중 하나만 실제로 할당됩니다.

마찬가지로 문서화되지 않은 sys.fn_PhysLocCracker함수를 사용하여 다음 과 같이 각 행이 존재하는 페이지를 표시하는 경우

SELECT *
FROM dbo.t
CROSS APPLY sys.fn_PhysLocCracker(%%PHYSLOC%%)

DATA_PAGE나열된 것만 볼 수 있습니다.

╔ ========= ╦ ========================================== ====== ╦ ========== ╦ ============
num rownum ║ on_row_data ║ off_row_data ║ file_id ║ page_id ║ slot_id ║
╠ ========= ╬ ========================================== ====== ╬ ========== ╬ ============
║ 1 ║ on_row_data ║ AAAAAAAAAAAAAAAAAAA ║ 3 ║ 105368 ║ 0 ║
╚ ========= ╩ ========================================== ====== ╩ ========== ╩ ============

마찬가지로, 사용 DBCC IND(database, table, index)하면 두 페이지 만 표시됩니다.

DBCC IND (tempdb, t, 1);

산출:

╔ ========== ╦ ========= ╦ ========= ╦ ===================== ============ ╦ ================== ╦ ===================== =================== ╦ =========== ╦ ===================== ======= ╦ ============== ╦ ================================ = ╗
║ PageFID ║ PagePID ║ IAMFID ║ IAMPID ║ ObjectID ║ IndexID ║ PartitionNumber ║ PartitionID ║ iam_chain_type ║ PageType ║ IndexLevel ║ NextPageFID ║ NextPagePID ║ PrevPageFID ║ PrevPagePID ║ ║
╠ ========== ╬ ========= ╬ ========= ╬ ===================== ============ ╬ ================== ╬ ===================== =================== ╬ =========== ╬ ===================== ======= ╬ ============== ╬ ================================ = ╣
║ 1 ║ 1598 ║ NULL ║ NULL ║ 2069582411 ║ 1 ║ 1 ║ 6989586877272752128 ║ 행 내 데이터 ║ 10 ║ NULL ║ 0 ║ 0 ║ 0 ║ 0 ║ ║
║ 3 ║ 105368 ║ 1 ║ 1598 ║ 2069582411 ║ 1 ║ 1 ║ 6989586877272752128 ║ 행 내 데이터 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ ║
╚ ========== ╩ ========= ╩ ========= ╩ ===================== ============ ╩ ================== ╩ ===================== =================== ╩ =========== ╩ ===================== ======= ╩ ============== ╩ ================================ = ╝

을 사용하여 실제 페이지 내용을 보면 여전히 ROW_OVERFLOW_DATA가 포함 된 페이지에 대해 아무것도 보이지 않는 DBCC PAGE것 같습니다. 아무것도 있어야한다고 확신합니다. 어떻게 볼 것인지 모르겠습니다.

DBCC PAGE (tempdb, 3, 105368 , 3) WITH TABLERESULTS;

메모리 덤프 행을 포함하면 결과가 너무 커서 여기에 맞지 않습니다. 그러나 이것은 헤더 출력입니다.

╔ =============== ╦ ==================================== ===================================================== ============== ╗
║ ParentObject ║ 개체 ║ 필드 ║ 값 ║
╠ =============== ╬ ==================================== ===================================================== ============== ╣
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ page 0x000002431A8A2000 ║
║ 버퍼 : : BUF @ 0x000002437E86D5C0 hash bhash ║ 0x0000000000000000 ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ bpageno ║ (3 : 105368) ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ bdbid ║ 2 ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ 참조 ║ 0 ║
║ 버퍼 : ║ BUF @ 0x000002437E86D5C0 bc bcputicks ║ 0 ║
║ 버퍼 : ║ BUF @ 0x000002437E86D5C0 ║ bsampleCount Count 0 ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 Use b 사용 1 ║ 63172 ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 stat bstat ║ 0x10b ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ 블로그 ║ 0x212121cc ║
BUFFER : ║ BUF @ 0x000002437E86D5C0 bnext ║ 0x0000000000000000 ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ bDirtyContext ║ 0x000002435DA77160 ║
║ BUFFER : ║ BUF @ 0x000002437E86D5C0 ║ bstat2 ║ 0x0 ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_pageId ║ (3 : 105368) ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_headerVersion ║ 1 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_type ║ 1 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_typeFlagBits ║ 0x0 ║
║ 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_level ║ 0 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_flagBits ║ 0xc000 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_objId (AllocUnitId.idObj) ║ 3920762 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_indexId (AllocUnitId.idInd) ║ 512 ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ 메타 데이터 : AllocUnitId ║ 144115445026914304 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ 메타 데이터 : PartitionId ║ 6989586877272752128 ║
║ 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ 메타 데이터 : IndexId ║ 1 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ 메타 데이터 : ObjectId ║ 2069582411 ║
║ 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_prevPage ║ (0 : 0) ║
║ 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_nextPage ║ (0 : 0) ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ pminlen ║ 8 ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_slotCnt ║ 1 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_freeCnt ║ 66 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_freeData ║ 8124 ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_reservedCnt ║ 0 ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_lsn ║ (36 : 47578 : 1) ║
║ 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_xactReserved ║ 0 ║
HEA 페이지 헤더 : @ 페이지 @ 0x000002431A8A2000 ║ m_xdesId ║ (0 : 0) ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_ghostRecCnt ║ 0 ║
║ 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ m_tornBits ║ 0 ║
HEA 페이지 헤더 : ║ 페이지 @ 0x000002431A8A2000 ║ DB Frag ID ║ 1 ║
║ 페이지 헤더 : ║ 할당 상태 ║ GAM (3 : 2) ║ 할당 됨 ║
║ 페이지 헤더 : ║ 할당 상태 ║ SGAM (3 : 3) ║ 할당되지 않음 ║
║ 페이지 헤더 : ║ 할당 상태 ║ PFS (3 : 105144) ║ 0x40 할당 된 0_PCT_FULL ║
║ 페이지 헤더 : ║ 할당 상태 ║ DIFF (3 : 6) ║ 변경되지 않음 ║
║ 페이지 헤더 : ║ 할당 상태 ║ ML (3 : 7) ║ NOT MIN_LOGGED ║
║ 페이지 헤더 : ║ 슬롯 0 오프셋 0x60 길이 8028 ║ 레코드 유형 ║ PRIMARY_RECORD ║
HEA 페이지 헤더 : ║ 슬롯 0 오프셋 0x60 길이 8028 ║ 레코드 속성 ║ NULL_BITMAP VARIABLE_COLUMNS ║
HEA 페이지 헤더 : ║ 슬롯 0 오프셋 0x60 길이 8028 ║ 레코드 크기 ║ 8028 ║
╚ =============== ╩ ==================================== ===================================================== ============== ╝

답변:


10

귀하의 데모는 REPLICATE한계에 부딪 치고 있습니다 :

string_expression이 varchar (max) 또는 nvarchar (max) 유형이 아닌 경우 REPLICATE는 반환 값을 8,000 바이트에서 자릅니다. 8,000 바이트보다 큰 값을 반환하려면 string_expression을 적절한 큰 값 데이터 형식으로 명시 적으로 캐스팅해야합니다.

내가 이렇게하면 :

INSERT INTO dbo.t (off_row_data) VALUES (REPLICATE(CAST('A' as varchar(max)), 20000));

그런 다음 dm_db_database_page_allocations에 대해 위에서 DMV 쿼리를 실행하면 PageTypeDesc가 페이지가 표시됩니다 TEXT_MIX_PAGE.

그런 다음 행 외부 페이지의 세부 사항을보기 위해 추적 플래그 3604를 사용하여 DBCC PAGE를 실행할 수 있습니다.

DBCC TRACEON (3604);
GO
DBCC PAGE (TestDB, 1, 20696 , 3) -- your page will be different :)

출력은 크지 만 시작 부분 가까이에 다음이 표시됩니다.

Blob row at: Page (1:20696) Slot 0 Length: 3934 Type: 3 (DATA)

그리고, 당신은 알다시피, A의 무리.


4
잘림 경고 또는 무언가가 있다면 좋지 않을 것입니다.
Max Vernon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.