stats_column_id এবং index_column_id ক্লাস্টার ইনডেক্সের শারীরিক ক্রম সহ আপডেট হয় না


14

আমি কলামটির উদ্দেশ্য সম্পর্কে ভুল বোঝাবুঝি না করে, নিম্নলিখিত কোডটি বোঝায় যে ক্লাস্টারড ইনডেক্সের কাঠামোর পরিবর্তনের stats_column_idফলে সিএস.স্ট্যাটস_ক্লামগুলি ডিএমভিতে কলামের অর্ডিনাল অবস্থান ( ) পরিবর্তন হবে না । (অ্যাডভেঞ্চার ওয়ার্কস ২০১৪, অ্যাডভেঞ্চার ওয়ার্কস ২০০৮ আর ২ তে পরীক্ষিত)

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;

তবে, ঘনত্বের ভেক্টরগুলি সূচক / পরিসংখ্যান অবজেক্টের শীর্ষস্থানীয় কলামে পরিবর্তন নির্দেশ করে। এটি কি আমার পক্ষ থেকে একটি মৌলিক ভুল বোঝাবুঝি? যদি তা হয় তবে আমি কীভাবে ডিএমভি ব্যবহার করে কোনও পরিসংখ্যানের অবজেক্টের শীর্ষস্থানীয় কলামটি খুঁজে পাব?

পরীক্ষিত এসকিউএল সার্ভার সংস্করণ: ২০০৮আর ২, ২০১৪


1
টেবিলের কলামটি কি অর্ডিনাল অবস্থান নয় ? আপনি যদি টেবিলটি ড্রপ করে পুনরায় তৈরি করেন এবং সেই কলামগুলির মূল অবস্থান পরিবর্তন করেন তবে কী হবে? আমার এখনই পরীক্ষার সময় নেই তবে আমি এটি সন্দেহজনকভাবে সুবিধাজনক বলে মনে করি যে পরিসংখ্যানগুলিতে সেগুলি 1,2,3 এবং টেবিলের মধ্যে 1,2,3 এবং সিসি কোডস কলামগুলিতে রয়েছে।
অ্যারন বারট্রান্ড

@ অ্যারনবার্ট্র্যান্ড হ্যাঁ এবং তারপরে সূচি_ কলামটি_ইড ... কিছু ... এবং key_ordinalএটি সূচক কলামগুলির ক্রম (সবেমাত্র এটি আবিষ্কার হয়েছে)। যাইহোক, sys.stats_column এ থাকা ডকুমেন্টেশনটি সূচিত করে যে stats_column_id একটি সাধারণ অবস্থান, তবে আমি এটি সম্পূর্ণ ভুল পড়তে পারি।
সোয়াশেক

2
আমি অনুমান করি যে আমি কেবল ব্যবহার করতে পারি INDEX_COL()যদিও আমি অস্পষ্টভাবে কাউকে স্মরণ করিয়ে
দিচ্ছি

উত্তর:


1

সমস্ত অ্যাকাউন্টের মাধ্যমে এটি সিস্টেস্টস_স্লট_সামগ্রী ডিএমভিতে একটি বাগড আচরণ হতে পারে। অভিভাবক সূচকগুলির মাধ্যমে কোনও পরিসংখ্যান আপডেট করা হলে এটি সমস্যা দেখা দিচ্ছে। আমি বিশ্বাস করি এটি একটি ব্যবস্থার পরিবর্তনে পরিসংখ্যান আপডেট করা হচ্ছে এমন পদ্ধতির কারণে be

আপনি যদি ম্যানুয়ালি কোনও পরিসংখ্যান তৈরি করেন এবং তারপরে কলামগুলি পরিবর্তন করতে চান তবে আপনাকে প্রথমে ড্রপ করে পুনরায় তৈরি করতে হবে যা মেটা-ডেটা প্রশ্নবিদ্ধ ডিএমভিতে আপডেট হতে বাধ্য করে। যে অপারেশনটিতে আপনি প্রদর্শিত হয়ে গেছেন সেখানে পরিস্থিতি উপস্থিত হতে পারে যেখানে কোনও পরিস্থিতিতে মেটাডেটা আপডেট হয় না (ডিবিসিসি *, চেকপয়েন্ট, সার্ভার পুনঃসূচনা, প্যারেন্ট ইনডেক্স পরিবর্তনের মাধ্যমে পরিসংখ্যান আপডেট ইত্যাদি) একবার পরিবর্তন হয়ে গেলে। আমার প্রাথমিক পরীক্ষা থেকে আমি মেটাডেটা সঠিকভাবে আপডেট হয়ে গেলে কেবলমাত্র একটি কেস খুঁজে পেতে পারি যা হ'ল ড্রপ এবং পুনরায় তৈরি করার দৃশ্য।

আপনি ইস্যুটির সাথে কানেক্ট আইটেমটি একবার দেখে নিতে পারেন এবং যথাযথভাবে আপ-ভোট করতে পারেন। সেখানে পোস্ট করা ক্যোয়ারির চারপাশে একটি কাজ রয়েছে তবে এর প্রক্রিয়াটি পরিসংখ্যানের নামের সাথে সূচকের নামটির সাথে মেলে এবং সূচি মেটা-ডেটা ব্যবহারের উপর ভিত্তি করে।


1

এসকিউএল সার্ভারে sys.dm ভিউগুলি থেকে অন্যরা সূচী তথ্য যেভাবে উদ্ধার করে তা পুনরুত্পাদন করার চেষ্টা করার সময় আমার একই সমস্যা ছিল having আমি কেবল সূচীতে কলামগুলির ক্রমটি বের করতে পারিনি।

প্রদত্ত টেবিলের জন্য কোনও প্রদত্ত সূচীতে কলামগুলির ক্রম নির্ধারণ করতে আমি তৈরি একটি স্ক্রিপ্ট নিম্নলিখিত:

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_colम টেবিলের কলামটি সেই ক্রম হয় যাতে কলামগুলি সূচীতে সঞ্চিত থাকে।

টেবিলের key_ordinalজন্য কোনও কলাম নেই sys.stats_columns। কলামটি stats_column_idকেবলমাত্র index_column_idসেই বস্তুর কলামটির প্রতিলিপি তৈরি করে যা এটি উল্লেখ করেছে।

এই কলামটির জন্য sys.stats_columns (লেনদেন-এসকিউএল) নিবন্ধটির শব্দের মধ্যে কিছুটা পার্থক্য রয়েছে stats_column_id:

পরিসংখ্যান কলামগুলির মধ্যে 1-ভিত্তিক অর্ডিনাল।

... এবং এই কলামটির জন্য sys.index_columns (লেনদেন-এসকিউএল) নিবন্ধে key_ordinal:

কী- কলামগুলির সেটের মধ্যে সাধারণ (1-ভিত্তিক) ।

আমি মনে করে যে, index_column_id(sys.index_columns) এবং stats_column_id(sys.stats_columns) একে অপরের সমতুল্য এবং কেবলমাত্র sys.index_columns টেবিল একটি ক্রম কলাম আছে, যথা key_ordinal

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.