Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2008:A ordenação por data e hora é muito lenta


Ordenando por id provavelmente usa uma verificação de índice clusterizado ao ordenar por datetime usa classificação ou pesquisa de índice.

Ambos os métodos são mais lentos do que uma varredura de índice clusterizado.

Se sua tabela estiver agrupada por id , basicamente significa que já está ordenado. Os registros estão contidos em um B+Tree que tem uma lista vinculada ligando as páginas em id ordem. O mecanismo deve apenas percorrer a lista vinculada para obter os registros ordenados por id .

Se o id s foram inseridos em ordem sequencial, isso significa que a ordem física das linhas corresponderá à ordem lógica e a varredura do índice clusterizado será ainda mais rápida.

Se você deseja que seus registros sejam ordenados por datetime , há duas opções:
  • Pegue todos os registros da tabela e classifique-os. A lentidão é óbvia.
  • Use o índice em datetime . O índice é armazenado em um espaço separado do disco, isso significa que o mecanismo precisa alternar entre as páginas de índice e as páginas da tabela em um loop aninhado. É mais lento também.

Para melhorar a ordenação, você pode criar um índice de cobertura separado em datetime :
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)

e inclua todas as colunas que você usa em sua consulta nesse índice.

Esse índice é como uma cópia de sombra de sua tabela, mas com dados classificados em ordem diferente.

Isso permitirá livrar-se das pesquisas de chave (já que o índice contém todos os dados) que farão a ordenação por datetime tão rápido quanto em id .

Atualização:

Uma nova postagem no blog sobre esse problema: