Kecuali saya salah memahami tujuan kolom, kode berikut menunjukkan bahwa perubahan struktur indeks berkerumun tidak mengubah posisi ordinal ( stats_column_id
) kolom dalam sys.stats_columns DMV. (Diuji dalam 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;
Namun, vektor kepadatan menunjukkan perubahan di kolom terkemuka objek indeks / statistik. Apakah ini kesalahpahaman mendasar di pihak saya? Jika demikian, bagaimana cara menemukan kolom utama objek statistik menggunakan DMV?
Versi SQL Server yang diuji: 2008R2, 2014
sql-server
statistics
dmv
swasheck
sumber
sumber
key_ordinal
merupakan urutan kolom indeks (baru saja menemukan itu). Namun, dokumentasi pada sys.stats_columns tampaknya menunjukkan bahwa stats_column_id adalah posisi ordinal, tetapi saya bisa membaca ini sepenuhnya salah.INDEX_COL()
meskipun saya samar-samar ingat seseorang yang mencatat bahwa fungsi pembantu mungkin bukan ide terbaikJawaban:
Oleh semua akun ini mungkin perilaku disadap di sys.stats_columns DMV. Ini tampaknya menyebabkan masalah ketika statistik diperbarui dengan indeks induk. Saya percaya ini karena mekanisme pembaruan statistik dalam perubahan kendala.
Jika Anda membuat statistik secara manual dan kemudian ingin mengubah kolom, Anda harus terlebih dahulu menjatuhkan dan membuat kembali yang memaksa meta-data diperbarui di DMV yang bersangkutan. Dalam operasi yang telah Anda tunjukkan, tampaknya ada situasi di mana metadata tidak diperbarui dalam keadaan apa pun (DBCC *, CHECKPOINT, server restart, pembaruan statistik melalui perubahan indeks induk, dll) setelah perubahan telah dibuat. Dari pengujian awal saya, saya hanya dapat menemukan satu kasus ketika metadata diperbarui dengan benar yang merupakan skenario drop dan re-create.
Anda dapat melihat item Connect pada masalah dan pilih suara yang sesuai. Ada pekerjaan seputar kueri yang diposting di sana, tetapi mekanismenya didasarkan pada pencocokan nama indeks dengan nama statistik dan memanfaatkan meta-data indeks.
sumber
Saya mengalami masalah yang sama ketika mencoba mereproduksi cara orang lain mengambil informasi indeks dari tampilan sys.dm di SQL Server. Saya hanya tidak tahu urutan kolom dalam indeks.
Berikut ini adalah skrip yang saya buat untuk menentukan urutan kolom dalam indeks yang diberikan untuk tabel tertentu:
Kolom
key_ordinal
dalam tabel sys.index_columns adalah urutan penyimpanan kolom dalam indeks.Tidak ada
key_ordinal
kolom untuksys.stats_columns
tabel. Kolomstats_column_id
hanya mereplikasiindex_column_id
kolom dari objek yang dirujuk.Ada sedikit perbedaan dalam kata-kata dari artikel sys.stats_columns (Transact-SQL) untuk kolom
stats_column_id
:... dan di artikel sys.index_columns (Transact-SQL) untuk
key_ordinal
kolom:Saya rasa bahwa
index_column_id
(sys.index_columns) danstats_column_id
(sys.stats_columns) adalah setara satu sama lain dan bahwa hanya tabel sys.index_columns memiliki kolom pemesanan, yaitukey_ordinal
.sumber