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: