sexta-feira, 11 de abril de 2014

SQL Server - Busca de Índices

Realmente não é uma tarefa trivial a análise e busca de índices no banco de dados do SQL Server, devido ao simples fato da diversidade deles.

Por exemplo, veja algumas opções abaixo:
Tipo Descrição Informação Adicional
Clustered Um índice [agrupado] ordena e armazena as linhas de dados da tabela ou visão baseado em uma chave de índice agrupada. O índice agrupado é implementado como uma estrutura na qual os dados de uma tabela poderão ser retornados rapidamente. Clustered And Nonclustered Indexes
Nonclustered Um índice [não agrupado] pode ser definido em uma tabela ou visão com um índice agrupado ou em uma pilha. Cada linha de um índice contém um valor chave não agrupado e um localizador de linha. Este localizador aponta para a linha de dados em um índice agrupado ou pilha tendo o valor da chave. Clustered And Nonclustered Indexes
Unique Um índice único assegura que a chave de índice não contém valor duplicado, portanto cada linha na tabela ou visão é unica. Create Unique Indexes
Index with included columns Refere-se a um índice [não agrupado] que é extendido para incluir colunas [não chave] em adição as colunas chave. Create Indexes with Included Columns

Além de vários outros...

Para um desenvolvedor, ter que buscar estes tipos de índices programaticamente pode ser desafiador. Então, como uma dica, segue abaixo tipos diferentes de Queries para retornar tipos diferentes de índices.

Busca de Foreign Keys

SELECT f.name AS ForeignKey,  
      TableSchema =   
           (SELECT TOP 1 s.name FROM sys.schemas s JOIN sys.tables t ON t.schema_id = s.schema_id AND t.object_id = f.parent_object_id),  
   OBJECT_NAME(f.parent_object_id) AS TableName,  
   COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,  
   ReferenceTableSchema =   
           (SELECT TOP 1 s.name FROM sys.schemas s JOIN sys.tables t ON t.schema_id = s.schema_id AND t.object_id = f.referenced_object_id),  
      OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,  
   COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName  
 FROM sys.foreign_keys AS f  
   INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id  



Busca de Primary Keys / Unique Key Constraints

 SELECT ROW_NUMBER() OVER (PARTITION BY k.name ORDER BY ic.key_ordinal, s.name, t.name, c.name) rowC,  
        s.name TABLE_SCHEMA, t.name TABLE_NAME,  
     k.name CONSTRAINT_NAME, K.type_desc CONSTRAINT_TYPE, c.name COLUMN_NAME,  
        ic.key_ordinal AS ORDINAL_POSITION  
 FROM sys.key_constraints k  
      JOIN sys.tables t ON t.object_id = k.parent_object_id  
      JOIN sys.schemas s ON s.schema_id = t.schema_id  
      JOIN sys.index_columns as ic ON ic.object_id = t.object_id  
      AND ic.index_id = k.unique_index_id  
      JOIN sys.columns as c ON c.object_id = t.object_id  
      AND c.column_id = ic.column_id  
 WHERE s.name <> 'dbo'  


Busca de [Unique Index]

 SELECT ROW_NUMBER() OVER (PARTITION BY i.name, s.name, o.name ORDER BY i.name, s.name, o.name, co.name) rowC,  
        i.name IndexName, s.name SchemaName, o.name TableName, co.name ColumnName, ic.key_ordinal ColumnOrder  
 FROM sys.indexes i   
 JOIN sys.objects o ON i.object_id = o.object_id  
 JOIN sys.index_columns ic ON ic.object_id = i.object_id   
    AND ic.index_id = i.index_id  
 JOIN sys.columns co ON co.object_id = i.object_id   
    AND co.column_id = ic.column_id  
 JOIN sys.tables t ON t.object_id = o.object_id  
 JOIN sys.schemas s ON s.schema_id = t.schema_id  
 WHERE i.[type] = 2   
 AND i.is_unique = 1   
 AND i.is_primary_key = 0  
 AND o.[type] = 'U'  


Busca de [Index Not Unique]

 SELECT ROW_NUMBER() OVER (PARTITION BY i.name, s.name, o.name ORDER BY i.name, s.name, o.name, ic.key_ordinal, co.name) rowC,  
        i.name IndexName, s.name SchemaName, o.name TableName, co.name ColumnName, ic.key_ordinal ColumnOrder  
 FROM sys.indexes i   
 JOIN sys.objects o ON i.object_id = o.object_id  
 JOIN sys.index_columns ic ON ic.object_id = i.object_id   
    AND ic.index_id = i.index_id  
 JOIN sys.columns co ON co.object_id = i.object_id   
    AND co.column_id = ic.column_id  
 JOIN sys.tables t ON t.object_id = o.object_id  
 JOIN sys.schemas s ON s.schema_id = t.schema_id  
 WHERE i.is_unique = 0   
 AND i.is_primary_key = 0


Busca de [Default Constraints]

 SELECT s.name SchemaName, t.name TableName, col_name(df.parent_object_id, df.parent_column_id) ColumnName, df.*  
 FROM sys.default_constraints df  
       JOIN sys.tables t ON df.parent_object_id = t.object_id  
       JOIN sys.schemas s ON t.schema_id = s.schema_id  


That's It!!

Nenhum comentário:

Postar um comentário

<< Ao enviar um comentário, favor clicar na opção [Enviar por e-mail comentários de acompanhamento para gtezini@gmail.com] >>