Sofern ich den Zweck der Spalte nicht falsch verstehe , gibt der folgende Code an, dass eine Änderung der Struktur des Clustered-Index die Ordnungsposition ( stats_column_id
) der Spalte in der DMV sys.stats_columns nicht ändert . (Getestet in 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;
Die Dichtevektoren zeigen jedoch eine Änderung in der führenden Spalte des Index- / Statistikobjekts an. Ist das ein grundsätzliches Missverständnis meinerseits? Wenn ja, wie würde ich die führende Spalte eines Statistikobjekts mithilfe von DMVs finden?
Getestete SQL Server-Versionen: 2008R2, 2014
sql-server
statistics
dmv
Swasheck
quelle
quelle
key_ordinal
ist die Reihenfolge der Indexspalten (soeben entdeckt). Die Dokumentation auf sys.stats_columns scheint jedoch darauf hinzudeuten, dass stats_column_id die Ordnungsposition ist, aber ich könnte dies völlig falsch lesen.INDEX_COL()
obwohl ich mich vage an jemanden erinnere, der bemerkt hat, dass dieseAntworten:
In allen Konten ist dies möglicherweise ein fehlerhaftes Verhalten in der DMV "sys.stats_columns". Dies scheint Probleme zu verursachen, wenn eine Statistik über den übergeordneten Index aktualisiert wird. Ich glaube, dass dies auf den Mechanismus zurückzuführen ist, mit dem die Statistiken bei einer Einschränkungsänderung aktualisiert werden.
Wenn Sie eine Statistik manuell erstellen und dann die Spalten ändern möchten, müssen Sie diese zuerst löschen und neu erstellen, wodurch die Aktualisierung der Metadaten in der betreffenden DMV erzwungen wird. In der von Ihnen gezeigten Operation scheint es eine Situation zu geben, in der die Metadaten nach der Änderung unter keinen Umständen aktualisiert werden (DBCC *, CHECKPOINT, Neustart des Servers, Aktualisierung der Statistiken durch Änderung des übergeordneten Index usw.). Nach meinen ersten Tests kann ich nur einen Fall finden, in dem die Metadaten ordnungsgemäß aktualisiert wurden. Dies ist das Szenario zum Löschen und Neuerstellen.
Sie können einen Blick auf den Connect-Artikel werfen und gegebenenfalls abstimmen. Dort wird eine Problemumgehungsabfrage veröffentlicht, deren Mechanismus darauf basiert, den Indexnamen mit dem Statistiknamen abzugleichen und die Index-Metadaten zu verwenden.
quelle
Ich hatte das gleiche Problem beim Versuch zu reproduzieren, wie andere Indexinformationen aus den sys.dm-Ansichten in SQL Server abrufen. Ich konnte nur die Reihenfolge der Spalten im Index nicht herausfinden.
Es folgt ein Skript, das ich erstellt habe, um die Reihenfolge der Spalten in einem bestimmten Index für eine bestimmte Tabelle zu bestimmen:
Die Spalte
key_ordinal
in der Tabelle sys.index_columns gibt die Reihenfolge an, in der die Spalten im Index gespeichert sind.Es gibt keine
key_ordinal
Spalte für diesys.stats_columns
Tabelle. Die Spaltestats_column_id
repliziert nur dieindex_column_id
Spalte des Objekts, auf das sie verweist.Es gibt einen kleinen Unterschied im Wortlaut des Artikels sys.stats_columns (Transact-SQL) für die Spalte
stats_column_id
:... und im Artikel sys.index_columns (Transact-SQL) für die
key_ordinal
Spalte:Ich
index_column_id
gehe davon aus, dass die Spalten (sys.index_columns) undstats_column_id
(sys.stats_columns) einander entsprechen und dass nur die Tabelle sys.index_columns eine Ordnungsspalte enthält, nämlichkey_ordinal
.quelle