आँकड़ों_column_id और index_column_id क्लस्टर किए गए अनुक्रमणिका के भौतिक क्रम के साथ अद्यतन नहीं होते हैं


14

जब तक मैं कॉलम के उद्देश्य को गलत नहीं समझ रहा हूं, निम्न कोड इंगित करता है कि क्लस्टर इंडेक्स की संरचना में बदलाव stats_column_idसे कॉलम की क्रमिक स्थिति ( ) sys.stats_columns DMV में नहीं बदलती है । (AdventureWorks2014, AdventureWorks2008R2 में परीक्षण किया गया)

select i.name, c.name, ic.column_id, ic.index_column_id
from sys.indexes i 
join sys.index_columns ic
    on i.object_id = ic.object_id
    and i.index_id = ic.index_id
join sys.columns c 
    on i.object_id = c.object_id
    and ic.column_id = c.column_id
where i.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID'
order by ic.key_ordinal;

select sh.name,s.name, c.name, c.column_id, sc.column_id, sc.stats_column_id
from sys.stats s 
join sys.stats_columns sc
    on s.object_id = sc.object_id
    and s.stats_id = sc.stats_id
join sys.columns c 
    on s.object_id = c.object_id
    and sc.column_id = c.column_id
join sys.tables t 
    on s.object_id = t.object_id
join sys.schemas sh
    on t.schema_id = sh.schema_id
where s.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID'
order by sc.stats_column_id;

dbcc show_statistics('[Person].[BusinessEntityAddress]','PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID') with density_vector;

ALTER TABLE [Person].[BusinessEntityAddress] DROP CONSTRAINT [PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID]
GO

ALTER TABLE [Person].[BusinessEntityAddress] ADD  CONSTRAINT [PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID] PRIMARY KEY CLUSTERED 
(
    AddressID ASC,
    [BusinessEntityID] ASC, 
    [AddressTypeID] ASC
)
GO


select i.name, c.name, ic.column_id, ic.index_column_id
from sys.indexes i 
join sys.index_columns ic
    on i.object_id = ic.object_id
    and i.index_id = ic.index_id
join sys.columns c 
    on i.object_id = c.object_id
    and ic.column_id = c.column_id
where i.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID'
order by ic.key_ordinal;

select sh.name,s.name, c.name, c.column_id, sc.column_id, sc.stats_column_id
from sys.stats s 
join sys.stats_columns sc
    on s.object_id = sc.object_id
    and s.stats_id = sc.stats_id
join sys.columns c 
    on s.object_id = c.object_id
    and sc.column_id = c.column_id
join sys.tables t 
    on s.object_id = t.object_id
join sys.schemas sh
    on t.schema_id = sh.schema_id
where s.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID'
order by sc.stats_column_id;

dbcc show_statistics('[Person].[BusinessEntityAddress]','PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID') with density_vector;

हालाँकि, घनत्व वैक्टर सूचकांक / सांख्यिकी ऑब्जेक्ट के प्रमुख कॉलम में बदलाव का संकेत देते हैं। क्या यह मेरी ओर से एक बुनियादी गलतफहमी है? यदि ऐसा है, तो मैं DMV का उपयोग करके किसी ऑब्जेक्ट ऑब्जेक्ट के प्रमुख कॉलम को कैसे ढूँढूंगा?

परीक्षण SQL सर्वर संस्करण: 2008R2, 2014


1
तालिका में क्रमिक स्थिति नहीं है ? यदि आप ड्रॉप करते हैं और तालिका को फिर से बनाते हैं और वास्तव में उन स्तंभों की क्रमिक स्थिति को बदलते हैं तो क्या होता है? मेरे पास अभी परीक्षण करने का समय नहीं है, लेकिन मुझे यह संदिग्ध रूप से सुविधाजनक लगता है कि वे आंकड़े में 1,2,3 और तालिका में 1,2,3 और sys.columns हैं।
हारून बर्ट्रेंड

@AaronBertrand हाँ। और फिर index_column_id है ... कुछ ... और key_ordinalसूचकांक कॉलम का क्रम है (बस यह पता चला है)। हालाँकि, sys.stats_columns पर दस्तावेज़ीकरण यह दर्शाता है कि आँकड़े_column_id क्रमिक स्थिति है, लेकिन मैं इसे पूरी तरह से गलत पढ़ सकता हूं।
स्वैसेज़

2
मुझे लगता है कि मैं अभी इस्तेमाल कर सकता हूं, INDEX_COL()हालांकि मैं किसी को याद नहीं करता हूं कि उन सहायक कार्यों का सबसे अच्छा विचार नहीं हो सकता है
स्वैच

जवाबों:


1

सभी खातों द्वारा यह sys.stats_columns DMV में एक खराब व्यवहार हो सकता है। ऐसा प्रतीत होता है कि समस्या तब उत्पन्न हो रही है जब मूल सूचकांक के माध्यम से एक आँकड़ा अद्यतन किया जाता है। मेरा मानना ​​है कि यह उस तंत्र के कारण है जिसके साथ आंकड़ों को एक बाधा परिवर्तन में अद्यतन किया जा रहा है।

क्या आपको मैन्युअल रूप से एक आँकड़ा बनाना चाहिए और फिर उन कॉलमों को बदलना होगा जिन्हें आपको पहले ड्रॉप करना होगा और फिर से बनाना होगा जो मेटा-डेटा को डीएमवी में अद्यतन करने के लिए मजबूर करता है। आपके द्वारा दिखाए गए ऑपरेशन में मेटाडेटा किसी भी परिस्थिति में अद्यतन नहीं होता है (DBCC *, CHECKPOINT, सर्वर रिस्टार्ट, स्टैटिस्टिक्स अपडेट पैरेंट इंडेक्स चेंज आदि के माध्यम से) एक बार परिवर्तन होने के बाद ऐसा प्रतीत होता है। अपने प्रारंभिक परीक्षण से मुझे केवल एक ही मामला मिल सकता है जब मेटाडेटा ठीक से अपडेट किया गया है जो ड्रॉप और री-क्रिएट परिदृश्य है।

आप मुद्दे पर कनेक्ट आइटम पर नज़र डाल सकते हैं और उचित रूप में वोट कर सकते हैं। वहां पर क्वेरी के चारों ओर एक काम पोस्ट किया गया है लेकिन इसका तंत्र इंडेक्स नाम को स्टेटिस्टिक नाम से मिलान करने और इंडेक्स मेटा-डेटा का उपयोग करने पर आधारित है।


1

SQL सर्वर में sysinos views से सूचकांक जानकारी प्राप्त करने के तरीके को पुन: पेश करने की कोशिश करते समय मुझे एक ही मुद्दा था। मैं अभी सूचकांक में कॉलम के क्रम का पता नहीं लगा सका।

निम्नलिखित तालिका के लिए किसी भी सूचकांक में कॉलम के क्रम को निर्धारित करने के लिए मैंने एक स्क्रिप्ट बनाई है:

SELECT s.name                  AS Schema_name,
       o.name                  AS Table_Name,
       i.type_desc             AS Index_Type,
       i.name                  AS Index_Name,
       c.name           AS Table_Column,
       i.fill_factor           AS Indx_Fill_Factor,
       ic.key_ordinal          AS [Key_ordinal (IDX Column_Order)],
       ic.index_column_id      AS Index_column_id,
       stc.stats_column_id     AS Stats_Col_ID,
       -- Additional info for each joined table
       -- comment out what you don't need
       -- 2 lines at a time
       --
       -- '| table object -->', -- column seperator
       -- o.*,
       -- '| schema object-->', -- column seperator
       -- s.*,
       '| index info-->', -- column seperator
       i.*,
       '| sys index info -->', -- column seperator
       si.*,
       '| indx cols info -->', -- column seperator
       ic.*,
       '| tab cols info -->', -- column seperator
       c.*,
       '| idx stats info -->', -- column seperator
       st.*,
       '| idx stats columns info -->', -- column seperator
       stc.*
FROM   sys.objects             AS o
       JOIN sys.schemas        AS s
            ON  s.schema_id = o.schema_id
       JOIN sys.indexes        AS i
            ON  i.object_id = o.object_id
       JOIN sys.sysindexes as si
            ON  si.[id] = i.object_id
            AND si.indid = i.index_id
       JOIN sys.index_columns  AS ic
            ON  ic.object_id = i.object_id
            AND ic.index_id = i.index_id
       JOIN sys.columns        AS c
            ON  c.object_id = ic.object_id
            AND c.column_id = ic.column_id
       JOIN sys.stats          AS st
            ON  st.object_id = i.object_id
            and st.stats_id = i.index_id 
      JOIN sys.stats_columns  AS stc
      ON c.column_id = stc.column_id
      AND stc.stats_id = st.stats_id
      AND stc.[object_id] = o.[object_id]
WHERE  1=1 
     --and i.type <> 1 -- Exclude Clustered Indexes. 0 = Heap; 1 = Clustered Index, 2 = Non-Clustered Index
       AND s.name != 'sys' -- Exclude sys items
       and o.name = 'BusinessEntityAddress'
       AND i.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID'
ORDER BY
       o.object_id,
       i.index_id,
       ic.key_ordinal

key_ordinalSys.index_columns तालिका में स्तंभ वह क्रम है जिसमें स्तंभ को अनुक्रमणिका में संग्रहीत किया जाता है।

तालिका के key_ordinalलिए कोई कॉलम नहीं है sys.stats_columns। कॉलम stats_column_idसिर्फ index_column_idउस ऑब्जेक्ट के कॉलम को दोहराता है जिसे वह संदर्भित करता है।

कॉलम के लिए लेख sys.stats_columns (Transact-SQL) के शब्दों में थोड़ा अंतर है stats_column_id:

सांख्यिकी कॉलम के सेट के भीतर 1-आधारित ऑर्डिनल।

... और स्तंभ के लिए sys.index_columns (Transact-SQL)key_ordinal लेख में:

साधारण (1-आधारित) कुंजी-पूर्व छात्रों के सेट के भीतर ।

मुझे लगता है कि index_column_id(sys.index_columns) और stats_column_id(sys.stats_columns) एक दूसरे के समतुल्य हैं और केवल sys.index_columns तालिका में एक ऑर्डरिंग कॉलम है, अर्थात् key_ordinal

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