L'ordinamento tramite id
utilizza probabilmente una scansione dell'indice cluster durante l'ordinamento di datetime
utilizza l'ordinamento o la ricerca dell'indice.
Entrambi questi metodi sono più lenti di una scansione indice cluster.
Se la tabella è raggruppata per id
, in pratica significa che è già stata ordinata. I record sono contenuti in un B+Tree
che ha un elenco collegato che collega le pagine nell'ordine id
. Il motore dovrebbe solo attraversare l'elenco collegato per ottenere i record ordinati da id
.
Se gli id
sono stati inseriti in ordine sequenziale, ciò significa che l'ordine fisico delle righe corrisponderà all'ordine logico e la scansione dell'indice cluster sarà ancora più veloce.
Se si desidera che i record da ordinare da datetime
, ci sono due opzioni:
- adottare tutti i record dalla tabella e ordinarli. La lentezza è ovvia.
- Utilizzare l'indice su
datetime
. L'indice è memorizzato in uno spazio separato del disco, questo significa che il motore deve passare tra le pagine indice e le pagine tabella in un ciclo annidato. È anche più lento.
Per migliorare l'ordinamento, è possibile creare un indice di copertura separato su datetime
:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
, e comprendono tutte le colonne che si utilizzano nella query in tale indice.
Questo indice è come una copia shadow della tabella ma con dati ordinati in ordine diverso.
Ciò consentirà di eliminare le ricerche di chiavi (poiché l'indice contiene tutti i dati) che renderà l'ordine entro datetime
così veloce come quello id
.
Aggiornamento:
un post fresco su questo problema:
Quale 'RDBMS' stai usando? – Quassnoi
Sto usando SQL Server 2008 – silent
è quella colonna datetime in un proprio indice separato? Dici "aggiunto .. all'indice" ....se la colonna datetime è ad es. colonna n. 3 in un indice composto, che non aiuta affatto quando si cerca di ordinare da quella colonna datetime da solo ........ –