Если я неправильно понимаю назначение столбца, следующий код указывает, что изменение структуры кластеризованного индекса не меняет порядковый номер ( stats_column_id
) столбца в DMV sys.stats_columns . (Проверено в 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 Server: 2008R2, 2014
sql-server
statistics
dmv
swasheck
источник
источник
key_ordinal
это порядок столбцов индекса (только что обнаружил). тем не менее, документация по sys.stats_columns указывает на то, что stats_column_id - это порядковая позиция, но я мог бы прочитать это совершенно неправильно.INDEX_COL()
хотя я смутно припоминаю, что кто-тоОтветы:
По общему мнению, это может быть ошибочное поведение в DMV sys.stats_columns. Это, кажется, вызывает проблемы, когда статистика обновляется посредством родительского индекса. Я полагаю, что это связано с механизмом обновления статистики при изменении ограничения.
Если вы создаете статистику вручную, а затем хотите изменить столбцы, вы должны сначала удалить и заново создать, что заставляет метаданные обновляться в соответствующем DMV. В продемонстрированной вами операции возникает ситуация, когда метаданные не обновляются ни при каких обстоятельствах (DBCC *, CHECKPOINT, перезапуск сервера, обновление статистики посредством изменения родительского индекса и т. Д.) После внесения изменения. Из моего первоначального тестирования я могу найти только один случай, когда метаданные обновлены должным образом, это сценарий удаления и повторного создания.
Вы можете взглянуть на пункт «Подключиться» по данному вопросу и проголосовать в случае необходимости. Существует опубликованный там запрос для обхода, но его механизм основан на сопоставлении имени индекса со статистическим именем и использовании метаданных индекса.
источник
У меня возникла та же проблема при попытке воспроизвести способ, которым другие получают информацию индекса из представлений sys.dm в SQL Server. Я просто не мог понять порядок столбцов в индексе.
Ниже приведен скрипт, который я создал для определения порядка столбцов в любом заданном индексе для данной таблицы:
Столбец
key_ordinal
в таблице sys.index_columns - это порядок, в котором столбцы хранятся в индексе.Там нет
key_ordinal
столбца дляsys.stats_columns
таблицы. Столбецstats_column_id
просто копируетindex_column_id
столбец объекта, на который он ссылается.Существует небольшая разница в формулировке статьи sys.stats_columns (Transact-SQL) для столбца
stats_column_id
:... и в статье sys.index_columns (Transact-SQL) для
key_ordinal
столбца:Я считаю, что
index_column_id
(sys.index_columns) иstats_column_id
(sys.stats_columns) являются эквивалентными друг другу, и что только таблица sys.index_columns имеет столбец порядка, а именноkey_ordinal
.источник