किसी विशिष्ट तालिका के लिए ROW_OVERFLOW_DATA पृष्ठ सूचीबद्ध करें


11

मैं एक तालिका के लिए पृष्ठों की एक सूची प्राप्त करने का प्रयास कर रहा हूं जिसमें ROW_OVERFLOW_DATA की पंक्तियाँ हैं। मुझे sys.db_db_database_page_allocationsअनिर्दिष्ट DMV से आवंटित पृष्ठों की सूची मिल सकती है , हालाँकि, उस 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

आउटपुट जैसा दिखता है:

╔════════╦════════╦══════════════╗
║ फाइलआईडी ID पेजआईडी T पेजटाइपडेस ║
╠════════╬════════╬══════════════╣
║ 1 ║ 1598 AM 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सूचीबद्ध देखता हूं :

╔════════╦═════════════╦═════════════════════╦════ ═════╦═════════╦═════════╗
║ पंक्तिबद्ध _ on_row_data row off_row_data _ file_id ║ page_id _ slot_id ║
╠════════╬═════════════╬═════════════════════╬════ ═════╬═════════╬═════════╣
║ 1 ║ on_row_data ║ AAAAAAAAAAAAAAAAAAAAA AA 3 ║ 105368 36 0 ║
╚════════╩═════════════╩═════════════════════╩════ ═════╩═════════╩═════════╝

इसी तरह, अगर मैं उपयोग करता DBCC IND(database, table, index)हूं तो मैं केवल सूचीबद्ध दो पृष्ठ देखता हूं:

DBCC IND (tempdb, t, 1);

आउटपुट:

╔═════════╦═════════╦════════╦════════╦═══════════ ═╦═════════╦═════════════════╦════════════════════ ═╦════════════════╦══════════╦════════════╦═══════ ══════╦═════════════╦═════════════╦═════════════╦═ ═╗
║ PageFID P पेजपिड F IAMFID ID IAMPID ID ऑब्जेक्ट ║ इंडेक्सआईडी ║ पार्टिशननंबर ║ पार्टिशनिड ║ iam_chain_type T पेजपाइप ║ IndexLevel ║ NextPageFID ║ नेक्स्टपेजेज ║ PrePPageFID ║ पेजपिड ║
╠═════════╬═════════╬════════╬════════╬═══════════ ═╬═════════╬═════════════════╬════════════════════ ═╬════════════════╬══════════╬════════════╬═══════ ══════╬═════════════╬═════════════╬═════════════╬═ ═╣
║ 1 ║ 1598 ║ NULL ║ NULL 95 2069582411 ║ 1 89 1 87 6989586877272752128 row इन-पंक्ति डेटा ║ 10 ║ NULL ║ 0 ║ 0 ║ 0 ║ 0 ║ ║ ║
║ 3 ║ 105368 ║ 1 ║ 1598 95 2069582411 ║ 1 89 1 87 6989586877272752128-इन-पंक्ति डेटा ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ ║ ║
╚═════════╩═════════╩════════╩════════╩═══════════ ═╩═════════╩═════════════════╩════════════════════ ═╩════════════════╩══════════╩════════════╩═══════ ══════╩═════════════╩═════════════╩═════════════╩═ ═╝

यदि मैं वास्तविक पृष्ठ सामग्री को DBCC PAGEदेखता हूं, तो इसका उपयोग ऐसा लगता है कि मुझे अभी भी कुछ दिखाई नहीं देता है कि किस पृष्ठ में ROW_OVERFLOW_DATA शामिल है - मुझे यकीन है कि यह वहां होना चाहिए, मुझे शायद यह नहीं पता है कि क्या देखना है:

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

परिणाम यहाँ फिट करने के लिए बहुत बड़े हैं, अगर मैं मेमोरी डंप पंक्तियों को शामिल करता हूं, लेकिन यह हेडर आउटपुट है:

╔══════════════╦════════════════════════════════╦═ ══════════════════════════════╦═══════════════════ ════════════╗
║ पेरेंटऑब्जेक्ट ║ ऑब्जेक्ट ║ फील्ड ║ वैल्यू ject
╠══════════════╬════════════════════════════════╬═ ══════════════════════════════╬═══════════════════ ════════════╣
║ BUFFER: UF BUF @ 0x000002437E86D5C0 ║ bpage 31 0x000002431A8A2000:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 sh bhash 0000 0x00000000000000000000:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 p bpageno: (3: 105368):
║ BUFFER: UF BUF @ 0x000002437E86D5C0 d bdbid: 2:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 re breferences ER 0:
║ खरीदार: UF BUF @ 0x000002437E86D5C0 c bcputicks ER 0:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 ample bsampleCount: 0:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 U bUse1 ║ 63172:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 at bstat ║ 0x10:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 ║ ब्लॉग 12 0x212121cc:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 xt bnext 0000 0x00000000000000000000:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 D bDirtyContext te 0x000002435DA77160:
║ BUFFER: UF BUF @ 0x000002437E86D5C0 at bstat2 ║ 0x0:
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_pageId 105 (3: 105368) ER
║ पेज हेडर: @ पेज @ ०x000002431A8A2000 HE m_headerVersion ║ 1 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_type ER 1 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_typeFlagBits B 0x0 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_level ER 0 AD
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_flagBits ║ 0xc000 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_objId (AllocUnitId.idObj) 20 3920762 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_indexId (AllocUnitId.idInd) ║ 512 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE मेटाडेटा: AllocUnitId 115 144115445026914304 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE मेटाडेटा: विभाजन I 6989586877272752128 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE मेटाडेटा: IndexId ER 1 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE मेटाडेटा: ObjectId 11 2069582411 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_prevPage 0 (0: 0) ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_nextPage 0 (0: 0) ER
║ पेज हेडर: @ पेज @ ०x000002431A8A2000 len pminlen ║ AD AD
║ पेज हेडर: @ पेज @ 0x000002431A8A2000 HE m_slotCnt ║ 1 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_freeCnt ║ 66 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_freeData ║ 8124 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_reservedCnt AD 0 ║
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_lsn 4 (36: 47578: 1) ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_xactReserved ER 0 ║
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_xdesId 0 (0: 0) ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_ghostRecCnt C 0 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE m_tornBits AD 0 ER
║ Page HEADER: @ पेज @ 0x000002431A8A2000 HE DB फ्रैग आईडी ║ 1 ER
║ PAGE HEADER: ocation आवंटन की स्थिति 3 GAM (3: 2) HE आवंटित ER
║ Page HEADER: Status आवंटन की स्थिति (SGAM (3: 3) OC आवंटित नहीं है ER
║ पेज का शीर्षक: ocation आवंटन की स्थिति (PFS (3: 105144) 40 0x40 आवंटित 0_PCT_FULL ER
║ Page HEADER: Status आवंटन की स्थिति (DIFF (3: 6) ED नहीं बदले गए ER
║ PAGE HEADER: ocation आवंटन की स्थिति 3 ML (3: 7) _L MIN_LOGGED AD नहीं
║ पेज हेडर: ot स्लॉट ० ऑफ़सेट ०x६० लंबाई ║०२ER HE रिकॉर्ड प्रकार IM PRIMARY_RECORD ER
║ PAGE HEADER: ot स्लॉट 0 ऑफसेट 0x60 लंबाई 8028 HE रिकॉर्ड गुण HE NULL_BITMAP VARIABLE_COLUMNS ER
║ PAGE HEADER: ot स्लॉट 0 ऑफसेट 0x60 लंबाई 8028 HE रिकॉर्ड आकार 28 8028 AD
╚══════════════╩════════════════════════════════╩═ ══════════════════════════════╩═══════════════════ ════════════╝

जवाबों:


10

आपका डेमो REPLICATE की सीमा से मारा जा रहा है :

यदि string_expression type 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 पृष्ठ चला सकता हूं:

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
क्या यह अच्छा नहीं होगा, हालाँकि, अगर वहाँ कोई चेतावनी चेतावनी, या कुछ और था।
मैक्स वर्नोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.