Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ordinamento chiave primaria

I dati vengono archiviati fisicamente dall'indice cluster, che di solito è la chiave primaria ma non deve esserlo.

Non è garantito che i dati in SQL abbiano un ordine senza una clausola ORDER BY. Dovresti sempre specificare una clausola ORDER BY quando hai bisogno che i dati siano in un ordine particolare. Se la tabella è già ordinata in questo modo, l'ottimizzatore non farà alcun lavoro extra, quindi non c'è nulla di male nel tenerlo lì.

Senza una clausola ORDER BY, l'RDBMS potrebbe restituire pagine memorizzate nella cache corrispondenti alla query mentre attende la lettura dei record dal disco. In tal caso, anche se nella tabella è presente un indice, i dati potrebbero non essere inseriti nell'ordine dell'indice. (Nota che questo è solo un esempio:non so né penso che un RDBMS del mondo reale lo farà, ma è un comportamento accettabile per un'implementazione SQL.)

MODIFICA

Se hai un impatto sulle prestazioni quando esegui l'ordinamento rispetto a quando non lo fai, probabilmente stai ordinando su una colonna (o un insieme di colonne) che non ha un indice (cluster o altro). Dato che si tratta di una serie temporale, potresti ordinare in base al tempo, ma l'indice cluster si trova sul bigint primario. SQL Server non sa che entrambi aumentano allo stesso modo, quindi deve ricorrere a tutto.

Se la colonna del tempo e la colonna della chiave primaria sono correlate per ordine (una aumenta se e solo se l'altra aumenta o rimane invariata), ordina invece per chiave primaria. Se non sono correlati in questo modo, sposta l'indice cluster dalla chiave primaria a qualsiasi colonna o colonne in base alla quale stai ordinando.