Velocità query indice cluster di SQL Server 2005
-
05-07-2019 - |
Domanda
I nostri siti vengono picchiati piuttosto forte, quindi stiamo esaminando l'ottimizzazione di alcune delle nostre query esistenti.
Durante l'esame, abbiamo riscontrato diverse query il cui piano di esecuzione era circa 4-5 volte più veloce quando nella query è presente un semplice riferimento all'indice cluster ... ad esempio
Se questa era la vecchia query:
SELECT ...
FROM myTable
WHERE categoryID = @category
la seguente query sarebbe 4 volte più veloce secondo il piano di esecuzione in SSMS:
SELECT ...
FROM myTable
WHERE categoryID = @category
AND lotID = lotID
Non possiamo sembrare sensati su come questo renderebbe la query più veloce. L'indice cluster è su lotID ma dato che sta facendo un confronto con se stesso, come può essere d'aiuto?
Soluzione
mi sembra abbastanza ovvio
la tua prima query non è coperta dall'indice cluster mentre la seconda è poiché lotID non è nella clausola WHERE della prima query
Potresti voler leggere SQL Server che copre gli indici per vedere come funziona tutto
devi anche capire che un indice cluster È i dati, tutti i dati per una tabella sono nell'indice cluster. quando si crea un indice non cluster sulla tabella che ha un indice cluster, l'indice non cluster avrà un puntatore all'indice cluster (poiché è lì che si trova il resto dei dati) a meno che non sia possibile soddisfare completamente la query da parte dei non cluster indice e in quel caso verrà utilizzato solo l'indice non cluster ... Adesso smetterò di divagare
Modifica
Ho letto AND lotID = @lotID NOT AND lotID = lotID
a volte puoi falsificare un indice cluster facendo lotID > 0 (selezionando il numero più basso che hai) e otterrai una ricerca
Quindi se il tuo lotID più piccolo = 1 e aggiungi E lotID > 0
potresti anche vedere una ricerca invece di una scansione, dimostrerò DOVE IndexValue > '' in questo post La ricerca di un indice è sempre migliore o più veloce di una scansione di indice?