AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 91118
Accepted
swasheck
swasheck
Asked: 2015-02-05 14:09:42 +0800 CST2015-02-05 14:09:42 +0800 CST 2015-02-05 14:09:42 +0800 CST

stats_column_id e index_column_id não são atualizados com a ordem física do índice clusterizado alterada

  • 772

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 clusterizado não altera a posição ordinal ( stats_column_id) da coluna no sys.stats_columns DMV. (Testado em 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? Em caso afirmativo, como encontraria a coluna inicial de um objeto de estatísticas usando DMVs?

Versões testadas do SQL Server: 2008R2, 2014

sql-server statistics
  • 2 2 respostas
  • 715 Views

2 respostas

  • Voted
  1. Best Answer
    John K. N.
    2017-01-12T08:00:19+08:002017-01-12T08:00:19+08:00

    Eu estava tendo o mesmo problema ao tentar reproduzir a maneira como os outros recuperam informações de índice das exibições sys.dm no SQL Server. Eu simplesmente não consegui descobrir a ordem das colunas no índice.

    A seguir está um script que criei para determinar a ordem das colunas em qualquer índice para uma determinada tabela:

    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
    

    A coluna key_ordinalna tabela sys.index_columns é a ordem na qual as colunas são armazenadas no índice.

    Não há uma key_ordinalcoluna para a sys.stats_columnstabela. A coluna stats_column_idapenas replica a index_column_idcoluna do objeto que ela referencia.

    Há uma pequena diferença no texto do artigo sys.stats_columns (Transact-SQL) para a coluna stats_column_id:

    Ordinal baseado em 1 dentro do conjunto de colunas de estatísticas.

    ...e no artigo sys.index_columns (Transact-SQL) para a key_ordinalcoluna:

    Ordinal (baseado em 1) dentro do conjunto de colunas -chave .

    Eu acho que o index_column_id(sys.index_columns) e stats_column_id(sys.stats_columns) são equivalentes um ao outro e que apenas a tabela sys.index_columns tem uma coluna de ordenação, ou seja, key_ordinal.

    • 2
  2. Travis Page
    2016-01-05T21:27:46+08:002016-01-05T21:27:46+08:00

    Por todas as contas, este pode ser um comportamento com bug no sys.stats_columns DMV. Isso parece estar causando problemas quando uma estatística é atualizada por meio do índice pai. Acredito que isso se deva ao mecanismo com que as estatísticas estão sendo atualizadas em uma mudança de restrição.

    Caso você crie uma estatística manualmente e depois deseje alterar as colunas, primeiro você deve descartar e recriar, o que força os metadados a serem atualizados no DMV em questão. Na operação que você demonstrou, parece haver uma situação em que os metadados não são atualizados em nenhuma circunstância (DBCC *, CHECKPOINT, reinicialização do servidor, atualização de estatísticas por meio da alteração do índice pai etc.) após a alteração. Do meu teste inicial, posso encontrar apenas um caso em que os metadados são atualizados corretamente, que é o cenário de soltar e recriar.

    Você pode dar uma olhada no item Connect sobre o problema e votar conforme apropriado. Há uma consulta alternativa postada 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.

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve