แสดงรายการหน้า ROW_OVERFLOW_DATA สำหรับตารางที่ระบุ


11

ฉันพยายามรับรายการหน้าสำหรับตารางที่มีแถวที่มี ROW_OVERFLOW_DATA ฉันสามารถรับรายการของหน้าที่จัดสรรจาก DMV ที่ไม่มีเอกสารsys.db_db_database_page_allocationsแต่ดูเหมือนจะไม่มีหน้า ROW_OVERFLOW_DATA ที่แสดงรายการในผลลัพธ์ของ DMV นั้น มี 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รายการ:

╔════════╦═════════════╦═════════════════════╦════ ═════╦═════════╦═════════╗
║ 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 ║ดัชนีหมายเลข║หมายเลขพาร์ติชัน║หมายเลขพาร์ติชัน║หมายเลขพาร์ติชัน║ iam_chain_type ║ประเภทเพจ║ดัชนีระดับ
╠═════════╬═════════╬════════╬════════╬═══════════ ═╬═════════╬═════════════════╬════════════════════ ═╬════════════════╬══════════╬════════════╬═══════ ══════╬═════════════╬═════════════╬═════════════╬═ ═╣
║ 1 ║ 1598 ║ NULL ║ NULL ║ 2069582411 ║ 1 ║ 1 ║ 6989586877272752128 ║ข้อมูลในแถว║ 10 ║ NULL ║ 0 ║ 0 ║ 0 ║ 0
║ 3 ║ 105368 ║ 1 ║ 1598 ║ 2069582411 ║ 1 ║ 1 ║ 6989586877272752128 data ข้อมูลในแถว║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0
╚═════════╩═════════╩════════╩════════╩═══════════ ═╩═════════╩═════════════════╩════════════════════ ═╩════════════════╩══════════╩════════════╩═══════ ══════╩═════════════╩═════════════╩═════════════╩═ ═╝

หากฉันดูเนื้อหาของหน้าเว็บจริงโดยใช้DBCC PAGEดูเหมือนว่าฉันยังไม่เห็นอะไรเกี่ยวกับหน้าใดที่มี ROW_OVERFLOW_DATA - ฉันแน่ใจว่ามันต้องอยู่ที่นั่นฉันอาจไม่รู้ว่าต้องดูอะไร:

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

ผลลัพธ์มีขนาดใหญ่เกินไปที่จะใส่ที่นี่ถ้าฉันรวมแถวดัมพ์หน่วยความจำ แต่นี่คือเอาต์พุตส่วนหัว:

╔══════════════╦════════════════════════════════╦═ ══════════════════════════════╦═══════════════════ ════════════╗
║ ParentObject ║วัตถุ║ฟิลด์║ค่า║
╠══════════════╬════════════════════════════════╬═ ══════════════════════════════╬═══════════════════ ════════════╣
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 page bpage ║ 0x000002431A8A2000 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bhash ║ 0x00000000000000000000 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bpageno ║ (3: 105368) ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bdbid ║ 2 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║การนัดสัมภาษณ์║ 0 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bcputicks ║ 0 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bsampleCount ║ 0 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bUse1 ║ 63172 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bstat ║ 0x10b ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║บล็อก║ 0x212121cc ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bnext ║ 0x00000000000000000000 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bDirtyContext ║ 0x000002435DA77160 ║
║ BUFFER: ║ BUF @ 0x000002437E86D5C0 ║ bstat2 ║ 0x0 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_pageId ║ (3: 105368) ║
HE ส่วนหัวของหน้า: @ หน้า @ 0x000002431A8A2000 ║ m_headerVersion ║ 1 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_type ║ 1 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_typeFlagBits ║ 0x0 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_level ║ 0 ║
HE ส่วนหัวของหน้า: @ หน้า @ 0x000002431A8A2000 ║ m_flagBits ║ 0xc000 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_objId (AllocUnitId.idObj) ║ 3920762 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_indexId (AllocUnitId.idInd) ║ 512 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ข้อมูลเมตา: AllocUnitId ║ 144115445026914304 ║
HE หัวหน้าเพจ: ║ Page @ 0x000002431A8A2000 ║ข้อมูลเมตา: พาร์ทิชันรหัส║ 6989586877272752128 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ข้อมูลเมตา: ดัชนีรหัส║ 1 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ข้อมูลเมตา: ObjectId ║ 2069582411 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_prevPage ║ (0: 0) ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_nextPage ║ (0: 0) ║
HE หัวหน้าเพจ: ║ Page @ 0x000002431A8A2000 ║ pminlen ║ 8 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_slotCnt ║ 1 ║
HE ส่วนหัวของหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_freeCnt ║ 66 ║
HE HEADER หน้า: @ หน้า @ 0x000002431A8A2000 ║ m_freeData ║ 8124 ║
HE ส่วนหัวของหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_reservedCnt ║ 0 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_lsn ║ (36: 47578: 1) ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_xactReserved ║ 0 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_xdesId ║ (0: 0) ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_ghostRecCnt ║ 0 ║
HE หน้าหัวหน้า: ║หน้า @ 0x000002431A8A2000 ║ m_tornBits ║ 0 ║
HE HEADER หน้า: ║หน้า @ 0x000002431A8A2000 ║ DB Frag ID ║ 1 ║
HE หัวหน้าเพจ: Status สถานะการจัดสรร║ GAM (3: 2) ║จัดสรร║
HE หัวหน้าเพจ: Status สถานะการจัดสรร║ SGAM (3: 3) ║ไม่จัดสรร║
HE PAGE HEADER: ║สถานะการจัดสรร║ PFS (3: 105144) ║ 0x40 จัดสรร 0_PCT_FULL ║
HE หน้าหัวหน้า: ║สถานะการจัดสรร║ DIFF (3: 6) ║ไม่เปลี่ยน║
HE หัวหน้าเพจ: Status สถานะการจัดสรร║ ML (3: 7) ║ไม่ใช่ MIN_LOGGED ║
HE HEADER หน้า: ║ช่อง 0 ออฟเซ็ต 0x60 ความยาว 8028 Type ประเภทบันทึก║ปรมาจารย์_RECORD║
HE หน้าหัวหน้า: ║ช่อง 0 ออฟเซ็ต 0x60 ความยาว 8028 ║คุณสมบัติบันทึก║ NULL_BITMAP VARIABLE_COLUMNS ║
HE PAGE HEADER: ║ช่อง 0 ออฟเซ็ต 0x60 ความยาว 8028 Size ขนาดบันทึก║ 8028 ║
╚══════════════╩════════════════════════════════╩═ ══════════════════════════════╩═══════════════════ ════════════╝

คำตอบ:


10

การสาธิตของคุณถูกจำกัด ด้วย REPLICATE :

หาก string_expression ไม่ใช่ประเภท varchar (สูงสุด) หรือ nvarchar (สูงสุด) REPLICATE จะตัดทอนค่าที่ส่งคืนเป็น 8,000 ไบต์ ในการส่งคืนค่าที่มากกว่า 8,000 ไบต์ string_expression จะต้องส่งไปยังประเภทข้อมูลขนาดใหญ่ที่เหมาะสมอย่างชัดเจน

ถ้าฉันทำสิ่งนี้:

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

และจากนั้นเรียกใช้แบบสอบถาม DMV ของคุณจากข้างบนกับ dm_db_database_page_allocations ฉันได้รับหน้าเว็บที่มี PageTypeDesc TEXT_MIX_PAGEของ

ฉันสามารถเรียกใช้ DBCC PAGE ด้วยการเปิดใช้งานการตั้งค่าสถานะการสืบค้นกลับ 3604 เพื่อดูรายละเอียดของหน้าปิดแถวนั้น:

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)

แล้วคุณก็รู้ว่ากลุ่มของเอ


4
มันจะไม่ดีถ้ามีคำเตือนการถูกตัดทอนหรือบางสิ่งบางอย่าง
Max Vernon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.