Qual é a diferença entre uma varredura de tabela e uma varredura de índice clusterizado?

StackOverflow https://stackoverflow.com/questions/18764

  •  09-06-2019
  •  | 
  •  

Pergunta

Já que tanto um Table Scan e um Clustered Index Scan essencialmente verifica todos os registros da tabela, por que uma verificação de índice clusterizado é supostamente melhor?

Por exemplo - qual é a diferença de desempenho entre os seguintes itens quando há muitos registros?:

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
Foi útil?

Solução

Em uma tabela sem um índice clusterizado (uma tabela heap), as páginas de dados não estão vinculadas entre si - portanto, percorrer as páginas requer um pesquisa no mapa de alocação de índice.

Uma tabela clusterizada, no entanto, tem seus páginas de dados vinculadas em uma lista duplamente vinculada - tornando as varreduras sequenciais um pouco mais rápidas.É claro que, em troca, você terá a sobrecarga de manter as páginas de dados em ordem. INSERT, UPDATE, e DELETE.Uma tabela heap, entretanto, requer uma segunda gravação no IAM.

Se sua consulta tiver um RANGE operador (por exemplo: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), então uma tabela clusterizada (em uma ordem garantida) seria mais eficiente - pois poderia usar as páginas de índice para encontrar as páginas de dados relevantes.Um heap teria que varrer todas as linhas, pois não pode depender de ordenação.

E, claro, um índice clusterizado permite que você faça um CLUSTERED INDEX SEEK, que é praticamente ideal para desempenho... um heap sem índices sempre resultaria em uma varredura de tabela.

Então:

  • Para sua consulta de exemplo em que você seleciona todas as linhas, a única diferença é a lista duplamente vinculada que um índice clusterizado mantém.Isso deve tornar sua tabela clusterizada um pouquinho mais rápida do que uma pilha com um grande número de linhas.

  • Para uma consulta com um WHERE cláusula que pode ser (pelo menos parcialmente) satisfeita pelo índice clusterizado, você sairá na frente por causa da ordem - portanto, não precisará verificar a tabela inteira.

  • Para uma consulta que não é satisfeita pelo índice clusterizado, você está praticamente equilibrado... de novo, a única diferença é aquela lista duplamente vinculada para verificação sequencial.Em ambos os casos, você está abaixo do ideal.

  • Para INSERT, UPDATE, e DELETE uma pilha pode ou não vencer.O heap não precisa manter a ordem, mas exige uma segunda gravação no IAM.Acho que a diferença relativa de desempenho seria insignificante, mas também bastante dependente dos dados.

A Microsoft tem um papel branco que compara um índice clusterizado a um índice não clusterizado equivalente em um heap (não exatamente o mesmo que discuti acima, mas próximo).A conclusão deles é basicamente colocar um índice clusterizado em todas as tabelas.Farei o meu melhor para resumir seus resultados (novamente, observe que eles estão realmente comparando um índice não clusterizado com um índice clusterizado aqui - mas acho que é relativamente comparável):

  • INSERT desempenho:o índice clusterizado ganha cerca de 3% devido à segunda gravação necessária para um heap.
  • UPDATE desempenho:o índice clusterizado ganha cerca de 8% devido à segunda pesquisa necessária para um heap.
  • DELETE desempenho:o índice clusterizado ganha cerca de 18% devido à segunda pesquisa necessária e à segunda exclusão necessária do IAM para um heap.
  • solteiro SELECT desempenho:o índice clusterizado ganha cerca de 16% devido à segunda pesquisa necessária para um heap.
  • faixa SELECT desempenho:o índice clusterizado ganha cerca de 29% devido à ordem aleatória de um heap.
  • simultâneo INSERT:a tabela heap ganha 30% sob carga devido a divisões de páginas para o índice clusterizado.

Outras dicas

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

O operador lógico e físico Clustered Index Scan verifica o índice clusterizado especificado na coluna Argument.Quando um predicado WHERE:() opcional está presente, apenas as linhas que satisfazem o predicado são retornadas.Se a coluna Argument contiver a cláusula ORDERED, o processador de consulta solicitou que a saída das linhas fosse retornada na ordem em que o índice clusterizado as classificou.Se a cláusula ORDERED não estiver presente, o mecanismo de armazenamento fará a varredura do índice da maneira ideal (não garantindo que a saída seja classificada).

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

O operador lógico e físico Table Scan recupera todas as linhas da tabela especificada na coluna Argument.Se um predicado WHERE:() aparecer na coluna Argumento, somente as linhas que satisfazem o predicado serão retornadas.

Uma varredura de tabela deve examinar cada linha da tabela.A verificação do índice clusterizado só precisa verificar o índice.Ele não verifica todos os registros da tabela.Esse é o ponto, realmente, dos índices.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top