Quais são os benefícios de não ter um índice clusterizado em uma tabela no SQL Server?
Vai:
SELECT * INTO TABLE_A FROM TABLE_B
Seja mais rápido se TABLE_A
for um heap?
Quais operações serão beneficiadas se a tabela for um heap?
Tenho certeza de que UPDATE
s e DELETE
s se beneficiarão de um índice clusterizado. E sobre INSERT
s? Meu entendimento é que INSERT
"pode" se beneficiar da tabela ser um heap, tanto em termos de velocidade, mas também de outros recursos e hardware (E/S, CPU, memória e armazenamento ...).
Qual é o recurso mais escasso em termos de hardware? Em termos de armazenamento, um heap ocupará menos espaço? O armazenamento em disco não é o recurso menos caro? Em caso afirmativo, é racional manter a tabela como heap para economizar espaço em disco? Como um heap afetará a CPU e a E/S com SELECT
, INSERT
e ? Que custo sobe quando a mesa é uma pilha e nós , e a partir dela?UPDATE
DELETE
SELECT
UPDATE
DELETE
Estou apenas abordando a questão no título. O corpo da pergunta tem muitas perguntas diferentes para serem respondidas em uma resposta de troca de pilha. Os heaps têm as seguintes vantagens sobre tabelas com índices clusterizados:
Tabelas com índices agrupados organizam fisicamente os dados na ordem desses índices. O otimizador de consulta do SQL Server pode adicionar uma classificação a um plano de consulta para inserções grandes o suficiente se os dados a serem inseridos ainda não estiverem classificados em ordem de chave clusterizada. O trabalho adicional realizado pela classificação não é gratuito e, como resultado, a consulta pode ser executada mais lentamente. As inserções em heaps não particionados não precisam de dados de origem classificados.
As regras para log mínimo funcionam de maneira diferente entre heaps e índices clusterizados. Em alguns cenários, uma inserção em um heap gravará menos bytes no log de transações do que uma inserção comparável em uma tabela com um índice clusterizado. Consulte o Guia de desempenho de carregamento de dados para obter alguns exemplos.
Um índice clusterizado impede a inserção paralela em uma tabela. A parte de inserção do plano de consulta estará sempre localizada em uma zona serial (DOP = 1). A partir do SQL Server 2016, uma inserção em um heap sem índices não clusterizados pode se qualificar para inserção paralela.
Um índice clusterizado adicionará contenção de bloqueio e trava quando muitos processos separados estiverem sendo inseridos na mesma tabela. Heaps sem índices não clusterizados podem ser carregados por muitos processos simultaneamente com menos contenção, especialmente quando essas inserções são originadas fora do SQL Server com bloqueios de atualização em massa.
Um heap é o segundo design de tabela menos caro para carregar e ler, depois de uma tabela com otimização de memória não durável. Portanto, é adequado para uso como uma mesa de preparação.
Para tabelas muito grandes, um columnstore clusterizado é muito melhor do que um heap. O carregamento é mais caro (especialmente se você não carregar em massa), mas é muito mais eficiente em termos de espaço e a leitura é muito, muito mais rápida.
Fora isso, suas tabelas normalmente devem ter uma chave primária clusterizada.