A menos que eu esteja entendendo mal a finalidade da coluna, o código a seguir indica que uma alteração na estrutura do índice em cluster não altera a posição ordinal ( stats_column_id
) da coluna na DMV sys.stats_columns . (Testado no 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;
No entanto, os vetores de densidade indicam uma alteração na coluna inicial do objeto de índice / estatística. Isso é um mal-entendido fundamental da minha parte? Se sim, como eu encontraria a coluna principal de um objeto de estatística usando DMVs?
Versões testadas do SQL Server: 2008R2, 2014
sql-server
statistics
dmv
swasheck
fonte
fonte
key_ordinal
é a ordem das colunas de índice (acabei de descobrir isso). no entanto, a documentação em sys.stats_columns parece indicar que stats_column_id é a posição ordinal, mas eu poderia estar lendo isso completamente errado.INDEX_COL()
embora Lembro-me vagamente de alguém observando que essas funções auxiliares podem não ser a melhor idéiaRespostas:
Por todas as contas, esse pode ser um comportamento com erros na DMV sys.stats_columns. Parece estar causando problemas quando uma estatística é atualizada por meio do índice pai. Eu acredito que isso se deve ao mecanismo com o qual as estatísticas estão sendo atualizadas em uma alteração de restrição.
Se você criar uma estatística manualmente e depois desejar alterar as colunas, você deve primeiro eliminar e recriar o que força os metadados a serem atualizados na DMV em questão. Na operação que você demonstrou, parece haver uma situação em que os metadados não são atualizados sob nenhuma circunstância (DBCC *, CHECKPOINT, reinicialização do servidor, atualização de estatísticas por meio da alteração do índice pai, etc.) depois que a alteração é feita. No meu teste inicial, posso encontrar apenas um caso em que os metadados são atualizados corretamente, que é o cenário de descartar e recriar.
Você pode dar uma olhada no item do Connect sobre o problema e votar novamente, conforme apropriado. Existe uma solução alternativa para a consulta publicada lá, mas seu mecanismo é baseado na correspondência do nome do índice com o nome da estatística e na utilização dos metadados do índice.
fonte
Eu estava tendo o mesmo problema ao tentar reproduzir a maneira como outras pessoas recuperam informações de índice dos modos de exibição sys.dm no SQL Server. Eu simplesmente não conseguia descobrir a ordem das colunas no índice.
A seguir, um script que criei para determinar a ordem das colunas em qualquer índice para uma determinada tabela:
A coluna
key_ordinal
na tabela sys.index_columns é a ordem em que as colunas são armazenadas no índice.Não há uma
key_ordinal
coluna para asys.stats_columns
tabela. A colunastats_column_id
apenas replica aindex_column_id
coluna do objeto que faz referência.Há uma pequena diferença na redação do artigo sys.stats_columns (Transact-SQL) para a coluna
stats_column_id
:... e no artigo sys.index_columns (Transact-SQL) da
key_ordinal
coluna:Eu acho que as
index_column_id
(sys.index_columns) estats_column_id
(sys.stats_columns) são equivalentes entre si e que apenas a tabela sys.index_columns possui uma coluna de pedidos, a saberkey_ordinal
.fonte