Como obtenho uma lista de todas as colunas de índice e índice no SQL Server 2005+? O mais próximo que pude chegar é:
select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id
where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0
order by ic.key_ordinal
O que não é exatamente o que eu quero.
O que eu quero é listar todos os índices definidos pelo usuário (o que significa que não há índices que suportem restrições exclusivas e chaves primárias ) com todas as colunas (ordenadas pela forma como elas aparecem na definição de índice) e o maior número possível de metadados.
sql-server
tsql
indexing
reverse-engineering
Anton Gogolev
fonte
fonte
Respostas:
Existem duas visualizações de catálogo "sys" que você pode consultar:
Eles fornecerão praticamente qualquer informação que você possa desejar sobre os índices e suas colunas.
EDIT: Esta consulta está ficando muito próxima do que você está procurando:
fonte
is_ms_shipped=0
), mas nenhuma chave primária (is_primary_key=0
) e nenhum índice criado para suportar apenas restrições exclusivas (is_unique_constraint=0
).WHERE (1=1)
deixou encadear e reordenar seusAND ...
s sem se preocupar com o que era o primeiro. Veja: stackoverflow.com/a/8149183/1160796 e stackoverflow.com/a/242831/1160796Você pode usar o
sp_helpindex
para visualizar todos os índices de uma tabela.E para todos os índices, você pode percorrer
sys.objects
para obter todos os índices para cada tabela.fonte
Nenhuma das opções acima fez o trabalho para mim, mas isso faz:
Se seus nomes incluem espaços, adicione colchetes ao redor deles nos scripts de criação.
Quando a última coluna Chave é nula, você sabe que nenhuma está faltando.
Filtrar chaves primárias, etc., como na solicitação original, é trivial.
NOTA: Tome cuidado com esta solução, pois ela não distingue as colunas indexadas e incluídas.
fonte
--Curto e grosso:
fonte
O seguinte funciona no SQL Server 2014/2016, bem como em qualquer banco de dados SQL do Microsoft Azure.
Produz um conjunto de resultados abrangente que é facilmente exportável para o Bloco de Notas / Excel para fatiar e cortar em cubos e inclui
fonte
Ei pessoal, eu não passei, mas consegui o que queria na consulta postada pelo autor original.
Usei-o (sem condições / filtros) para o meu requisito, mas ele deu resultados incorretos
O principal problema foi o resultado da obtenção de produtos cruzados sem condição de associação no index_id
fonte
Eu precisava obter índices específicos, suas colunas de índice e suas colunas incluídas também. Aqui está a consulta que eu usei:
fonte
SELECT
para gerar asCREATE
declarações:,CreateStatement = 'CREATE INDEX [' + INX.[name] + '] ON dbo.[' + TBL.[name] + '] (' + REPLACE(DS1.IndexColumnsNames, '] [', '], [') + ')' + CASE WHEN DS2.IncludedColumnsNames IS NOT NULL THEN ' INCLUDE (' + REPLACE(DS2.IncludedColumnsNames, '] [', '], [') + ')' ELSE '' END
.A seguir dá o que é semelhante ao sp_helpindex tablename
fonte
Com base na resposta aceita e em duas outras perguntas 1 , 2 , montei a seguinte consulta:
Esta consulta retorna resultados como abaixo, que mostra a lista de índices, suas colunas e uso. Muito útil para determinar qual índice tem um desempenho melhor que outros:
fonte
isso vai funcionar:
isso não retorna o nome da tabela e você receberá avisos para todas as tabelas sem um índice; se isso for um problema, você poderá criar um loop sobre as tabelas que possuem índices como este:
EDIT,
se desejar, você pode filtrar os dados, aqui estão alguns exemplos (estes funcionam para qualquer um dos métodos):
fonte
fonte
index_column_id
é a ordem das colunas no PK, mas na tabela! Use em vez disso.key_ordinal
Essa é uma maneira de fazer backup nos índices. Você pode usar o SHOWCONTIG para avaliar a fragmentação. Ele listará todos os índices do banco de dados ou tabela, junto com as estatísticas. Gostaria de advertir que em um banco de dados grande, pode ser demorado. Para mim, um dos benefícios dessa abordagem é que você não precisa ser um administrador para usá-la.
--Mostrar informações de fragmentação em todos os índices em um banco de dados
... DESLIGUE NOCOUNT quando terminar
--Mostrar informações de fragmentação em todos os índices em uma tabela
- Exibir informações de fragmentação em um índice específico
fonte
Posso arriscar outra resposta para essa pergunta saturada?
Esta é uma reformulação liberal da resposta @marc_s, misturada com algumas coisas de @Tim Ford, com o objetivo de ter um conjunto de resultados um pouco mais limpo e mais simples, uma exibição final e pedidos para a minha necessidade atual.
fonte
com base no código Tim Ford, esta é a resposta certa:
fonte
index_column_id
é a ordem das colunas no PK, mas na tabela! Use em vez disso.key_ordinal
Eu vim com este, que está me dando a visão exata exata que eu preciso. O que ajuda é que você obtenha uma linha por índice na qual as colunas do índice são agregadas.
fonte
Como o seu perfil afirma que você está usando o .NET, você pode usar o SMO (Server Managed Objects) programaticamente ... caso contrário, qualquer uma das respostas acima é fantástica.
fonte
A solução acima é elegante, mas, de acordo com o MS, INDEXKEY_PROPERTY está sendo preterido. Consulte: http://msdn.microsoft.com/en-us/library/ms186773.aspx
fonte
No Oracle
No SQL Server com
fonte
Observe que, se você usar alguma das consultas de trabalho acima para criar scripts de seus índices, precisará incorporar a coluna filter_definition da tabela sys.indexes em suas consultas para obter a definição de filtro de índices não agrupados no SQL 2008+
SOU
fonte
A consulta abaixo inclui todas as informações pertinentes para os índices definidos pelo usuário (sem índices para restrições exclusivas e chaves primárias) com todas as colunas:
Como um bônus adicional, a consulta abaixo é formatada para gravar os scripts criar índice e eliminar índices:
fonte
Este é meu, funciona em um esquema padrão, mas pode ser facilmente aprimorado. Fornece 3 colunas com SQLQueries - Criar / Soltar / Reconstruir (sem reorganização)
Inquerir:
Resultado
fonte
Primeiro, observe que todas as consultas acima podem perder ou incorporar erroneamente o INCLUDE colunas dos índices. Também falta em algumas opções a ordenação adequada e / ou a opção ASC / DESC das colunas.
Modificada a consulta acima por jona. Além disso, em muitos bancos de dados que uso, instalo minha própria função agregada CLR CONCATENATE; portanto, o código abaixo depende de algo como isso estar presente. As instruções SQL acima reduzidas para um muito mais sustentável:
Há muitos agregações concatenação disponíveis se o seu ambiente permitir que funções baseadas em CLR sejam adicionadas a ele.
fonte
Para colunas exclusivas por índice:
fonte
Aqui está a melhor maneira de fazer isso:
Prefiro usar junções implícitas, pois é muito mais fácil para mim entender. Você pode remover a referência object_id, pois talvez não seja necessário.
Felicidades.
fonte
Usando o SQL Server 2016, isso fornece uma lista completa de todos os índices, com um dump incluído de cada tabela para que você possa ver como as tabelas se relacionam. Ele também mostra as colunas incluídas nos índices de cobertura:
fonte
index_column_id
é a ordem das colunas no PK, mas na tabela! Use em vez disso.key_ordinal
Eu usei a seguinte consulta quando tive esse requisito ...
fonte
Solução de trabalho para o SQL Server 2014. Incluí apenas alguns campos de saída aqui, mas fique à vontade para adicionar quantos quiser.
fonte
index_column_id
é a ordem das colunas no PK, mas na tabela! Use em vez disso.key_ordinal
fonte
index_column_id
é a ordem das colunas no PK, mas na tabela! Use em vez disso.key_ordinal