Este White Paper de 2007 compara o desempenho de instruções individuais de seleção/inserção/exclusão/atualização e seleção de intervalo em uma tabela organizada como um índice clusterizado versus uma tabela organizada como um heap com um índice não clusterizado nas mesmas colunas de chave que o CI tabela.
Geralmente, a opção de índice agrupado teve melhor desempenho nos testes, pois há apenas uma estrutura para manter e porque não há necessidade de pesquisas de favoritos.
Um caso potencialmente interessante não coberto pelo artigo seria uma comparação entre um índice não clusterizado em um heap versus um índice não clusterizado em um índice clusterizado. Nesse caso, eu esperava que o heap pudesse ter um desempenho ainda melhor, pois uma vez no nível de folha NCI, o SQL Server tem um RID para seguir diretamente, em vez de precisar percorrer o índice clusterizado.
Alguém está ciente de testes formais semelhantes que foram realizados nesta área e, em caso afirmativo, quais foram os resultados?
Para verificar seu pedido criei 2 tabelas seguindo esse esquema:
A primeira tabela chamada
heap
obteve um índice não clusterizado no campogroup
. A segunda tabela chamadaclust
obteve um índice clusterizado no campo sequencial chamadokey
e um índice não clusterizado no campogroup
Os testes foram executados em um processador I5 M540 com 2 núcleos hyperthreaded, 4Gb de memória e Windows 7 de 64 bits.
SELECIONE o desempenho
Para verificar os números de desempenho, executei as seguintes consultas uma vez na tabela heap e uma vez na tabela cluster:
Os resultados deste benchmark são para
heap
:para a tabela
clust
os resultados são:SELECIONE COM JOIN desempenho
cmd.CommandText = "select * from heap/clust h join keys k on h.group = k.group where h.group between @id and @id+1000";
Os resultados deste benchmark são para
heap
:873 linhas têm > 0 CPU e afetam mais de 0 linhas
Os resultados deste benchmark são para
clust
:865 linhas têm > 0 CPU e afetam mais de 0 linhas
ATUALIZAR desempenho
O segundo lote de consultas são instruções de atualização:
os resultados deste benchmark para
heap
:os resultados deste benchmark para
clust
:EXCLUIR referências
o terceiro lote de consultas que executei são instruções de exclusão
O resultado deste benchmark para
heap
:o resultado deste benchmark para
clust
:INSERIR benchmarks
A última parte do benchmark é a execução de instruções de inserção.
inserir no heap/clust (...) valores (...), (...), (...), (...), (...), (...)
O resultado deste benchmark para
heap
:O resultado deste benchmark para
clust
:Conclusões
Embora haja mais leituras lógicas acontecendo ao acessar a tabela com o índice clusterizado e não clusterizado (ao usar o índice não clusterizado), os resultados de desempenho são:
Of course my benchmark was very limited on a specific kind of table and with a very limited set of queries, but I think that based on this information we can already start saying that it is virtually always better to create a clustered index on your table.
As we can see from the added results, the conclusions on the limited tests were not correct in every case.
The results now indicate that the only statements which benefit from the clustered index are the update statements. The other statements are about 30% slower on the table with clustered index.
Some additional charts where I plotted the weighted duration per query for heap vs clust.
As you can see the performance profile for the insert statements is quite interesting. The spikes are caused by a few data points which take a lot longer to complete.
Como Kimberly Tripp - a Rainha da Indexação - explica muito bem em sua postagem no blog The Clustered Index Debate continua... , ter uma chave de clustering em uma tabela de banco de dados praticamente acelera todas as operações - não apenas
SELECT
.SELECT são geralmente mais lentos em um heap em comparação com uma tabela em cluster, desde que você escolha uma boa chave de cluster - algo como um arquivo
INT IDENTITY
. Se você usar uma chave de cluster muito ruim, como um GUID ou uma chave composta com muitos componentes de comprimento variável, então, mas somente então, um heap pode ser mais rápido. Mas, nesse caso, você realmente precisa limpar o design do banco de dados em primeiro lugar...Portanto, em geral, não acho que haja sentido em uma pilha - escolha uma chave de cluster boa e útil e você deve se beneficiar em todos os aspectos.
Just happened to come across this article from Joe Chang that addresses this question. Pasted his conclusions below.