गुच्छेदार स्तंभ पर गैर-संकुलित सूचकांक भंडारण


18

SQL सर्वर में, एक गैर-अद्वितीय nonclustered अनुक्रमणिका को किसी रोस्टोरेंस टेबल पर बेस ऑब्जेक्ट के बुकमार्क (RID या क्लस्टरिंग कुंजी) को गैर- संकुलित इंडेक्स संरचना के सभी स्तरों पर शामिल करता है। सभी गैर-सूचकांक सूचकांक कुंजी के हिस्से के रूप में बुकमार्क को सभी सूचकांक स्तरों पर संग्रहीत किया जाता है।

दूसरी ओर, यदि गैर-अनुक्रमित सूचकांक अद्वितीय है , तो बुकमार्क केवल सूचकांक के पत्ती स्तर पर मौजूद है - कुंजी के भाग के रूप में नहीं (बुकमार्क एक या एक से अधिक स्तंभों के रूप में मौजूद है, प्रभाव में)।

SQL सर्वर 2016 में, एक कॉलम-ओरिएंटेड टेबल (जिस पर क्लस्टर्ड कॉलमस्टोर इंडेक्स है) पर नॉन -स्टस्टर्ड बी-ट्री इंडेक्स बनाना संभव है।

  1. क्लस्टर किए गए कॉलमस्टोर टेबल पर एक गैर-संकुलित बी-ट्री इंडेक्स के लिए उपयोग किया जाने वाला 'बुकमार्क' क्या है?
  2. क्या ऊपर वर्णित अद्वितीय और गैर-अद्वितीय गैर-अनुक्रमित अनुक्रमित के बीच अंतर अभी भी लागू होता है?

जवाबों:


17
  1. "बुकमार्क" कॉलमस्टोर इंडेक्स ओरिजिनल लोकेटर (प्रति डिमरी कोरोटकेविच द्वारा "प्रो एसक्यूएल सर्वर इंटरनल्स" है)। यह एक 8-बाइट मान है, जिसमें row_group_idपहले 4-बाइट्स में कॉलमस्टोर इंडेक्स और दूसरा 4-बाइट्स में एक ऑफसेट है।

  2. यदि आप DBCC PAGEगैर-संकुल सूचकांक को देखने के लिए उपयोग करते हैं, तो DBCC PAGEउत्पादन के "विशिष्ट" कॉलम में 8-बाइट कॉलमस्टोर इंडेक्स मूल लोकेटर दिखाई देता है । इससे पता चलता है कि एक अद्वितीय गैर-संकुल सूचकांक को कॉलमस्टोर पंक्ति लोकेटर को शामिल करने की आवश्यकता नहीं है, जबकि एक गैर-अद्वितीय गैर-क्लस्टर सूचकांक करता है।

निम्न कोड समान स्तंभ पर एक अद्वितीय और गैर-अद्वितीय बी-ट्री नॉनक्लेस्टेड इंडेक्स के साथ एक स्तंभ-संगठित तालिका बनाता है:

CREATE TABLE dbo.Heapish
(
    c1 bigint NOT NULL,
    c2 bigint NOT NULL,
    INDEX CCI_dbo_Heapish CLUSTERED COLUMNSTORE
);
GO
INSERT dbo.Heapish WITH (TABLOCKX)
    (c1, c2)
SELECT TOP (1024 * 1024 * 8)
    c1 = ROW_NUMBER() OVER
        (ORDER BY C1.[object_id], C1.column_id),
    c2 = ROW_NUMBER() OVER
        (ORDER BY C1.[object_id], C1.column_id)
FROM master.sys.columns AS C1
CROSS JOIN master.sys.columns AS C2
ORDER BY
    c1
OPTION (MAXDOP 1);
GO
CREATE UNIQUE NONCLUSTERED INDEX UNIQUE_c2 ON dbo.Heapish (c2) WITH (MAXDOP = 1);
CREATE NONCLUSTERED INDEX NONUNIQUE_c2 ON dbo.Heapish (c2) WITH (MAXDOP = 1);

हम उपयोग कर रहे बी-ट्री के विभिन्न स्तरों पर सूचकांक पंक्ति का आकार देख सकते हैं sys.dm_db_index_physical_stats:

SELECT
    DDIPS.index_level,
    DDIPS.page_count,
    DDIPS.record_count,
    DDIPS.min_record_size_in_bytes,
    DDIPS.max_record_size_in_bytes
FROM sys.dm_db_index_physical_stats
(
    DB_ID(),
    OBJECT_ID(N'dbo.Heapish', N'U'),
    INDEXPROPERTY(OBJECT_ID(N'dbo.Heapish', N'U'), N'UNIQUE_c2', 'IndexID'),
    NULL, 'DETAILED'
) AS DDIPS;

SELECT
    DDIPS.index_level,
    DDIPS.page_count,
    DDIPS.record_count,
    DDIPS.min_record_size_in_bytes,
    DDIPS.max_record_size_in_bytes
FROM sys.dm_db_index_physical_stats
(
    DB_ID(),
    OBJECT_ID(N'dbo.Heapish', N'U'),
    INDEXPROPERTY(OBJECT_ID(N'dbo.Heapish', N'U'), N'NONUNIQUE_c2', 'IndexID'),
    NULL, 'DETAILED'
) AS DDIPS;

आउटपुट है:

अनोखा सूचकांक

नॉनक्युकि इंडेक्स

पत्ती के स्तर पर दोनों संरचनाओं का आकार समान होता है, लेकिन 8-बाइट वाले कॉलमस्टोर लोकेटर के कारण नॉन-लीफ नॉनक्लेस्टेड इंडेक्स नॉन-लीफ लेवल पर यूनीक नॉनक्लेस्टर्ड इंडेक्स से 12 बाइट्स बड़ा होता है, साथ ही पहले वेरिएबल के लिए ओवरहेड का 4 बाइट्स एक पंक्ति में -length स्तंभ (uniquifier परिवर्तनशील लंबाई है)।


और क्या होगा यदि संबंधित पंक्ति डेल्टा स्टोर में है? जब डेल्टा स्टोर संकुचित हो रहा है तो क्या होगा?
— आर्टचैट्स खाचरटैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.