terça-feira, 13 de novembro de 2012

Index Clustered X Nonclustered- SqlServer

 

Segue algumas das diferenças entre os dois tipos de index do SqlServer:

O tipo de index Clustered realiza a ordenação dos dados com os valores da coluna que foi selecionada para fazer parte do index, ou seja, a ordem é realizada com os próprios dados da coluna pertencente ao index. Dessa forma as informações são gravadas na tabela física na mesma ordem do index facilitando bastante a localização de registros na tabela.

Por ordenar fisicamente os dados na tabela de acordo como o valor da coluna do index, para cada tabela podemos ter apenas um index Clustered.

Apesar de melhorar o desempenho na localização de um registro, temos um tempo extra gasto com inclusões ou exclusões de dados, isso acontece pois caso seja incluído ou excluído um registro pode ser que a ordem seja alterada e que ocorra um reposicionamento dos dados.

Em uma tabela pode existir index Clustered e Nonclustered, mas devemos lembrar de sempre criar primeiramente o index Clustered já que com sua criação todos os dados serão reposicionados na tabela para assumir a ordem da coluna que ira compor o index.

O tipo de index Nonclustered funciona de maneira diferente do Clustered, ou seja, no momento da criação do index as informações físicas da tabela não são reposicionadas, ficando assim o armazenamento de ordem aleatória.

É indicado o uso de index Nonclustered quando há necessidade de localizar dados que possuem diferentes tipos de critérios, ou seja, é indicado quando na localização de registros o filtro realizada utiliza diferentes campos podendo ter um ou mais index Nonclustered para cada critério selecionado no filtro da query.

Obrigado

2 comentários:

Rafael R Santos disse...

No caso do BI, onde há grande quantidade de leitura e escrita no momento do ETL(que é no momento da carga). Seria interessante ter clustered nas PK e nonclustered nos campos em dimensões e nonclustered nas fatos?

Fabio Martinez disse...

Rafael, tudo depende de como esta o seu processo, no meu caso tenho uma área Stage onde gravo informações sem nenhuma transformação (Extract), após isso tenho uma area de enriquecimento (trasnformation e Load) onde utilizo Clustered.

Após isso tenho toda a transferencia para o meu DW onde não utilizo desse recurso (clustered) por se tratar de um database colunar

Obrigado