Qual è la differenza tra un Index Scan e un Index Seek in un piano di esecuzione di SQL Server
Sono su SQL Server 2005.
Risposte:
Una scansione dell'indice è dove il server SQL legge l'intero indice alla ricerca di corrispondenze: il tempo necessario è proporzionale alla dimensione dell'indice.
Una ricerca dell'indice è dove il server SQL utilizza la struttura b-tree dell'indice per cercare direttamente i record corrispondenti (vedere http://mattfleming.com/node/192 per un'idea su come funziona) - il tempo impiegato è solo proporzionale a il numero di record corrispondenti.
La regola di base da seguire è che le scansioni sono cattive, le ricerche sono buone.
Scansione indice
Quando SQL Server esegue una scansione, carica l'oggetto che desidera leggere dal disco nella memoria, quindi lo legge dall'alto verso il basso cercando i record di cui ha bisogno.
Ricerca indice
Quando SQL Server esegue una ricerca, sa dove si trovano i dati nell'indice, quindi carica l'indice dal disco, va direttamente alla parte dell'indice di cui ha bisogno e legge dove finiscono i dati di cui ha bisogno . Questa è ovviamente un'operazione molto più efficiente di una scansione, poiché SQL sa già dove si trovano i dati che sta cercando.
Come posso modificare un piano di esecuzione per utilizzare una ricerca invece di una scansione?
Quando SQL Server cerca i tuoi dati, probabilmente una delle cose più grandi che farà passare SQL Server da una ricerca a una scansione è quando alcune delle colonne che stai cercando non sono incluse nell'indice che desideri venga utilizzato. Molto spesso, SQL Server tornerà a eseguire una scansione dell'indice cluster, poiché l'indice cluster contiene tutte le colonne della tabella. Questo è uno dei motivi principali (almeno secondo me) per cui ora abbiamo la possibilità di INCLUDERE colonne in un indice, senza aggiungere quelle colonne alle colonne indicizzate dell'indice. Includendo le colonne aggiuntive nell'indice, aumentiamo la dimensione dell'indice, ma consentiamo a SQL Server di leggere l'indice, senza dover tornare all'indice cluster o alla tabella stessa per ottenere questi valori.
Riferimenti
Per informazioni sulle specifiche di ciascuno di questi operatori all'interno di un piano di esecuzione di SQL Server, vedere ....
Risposta breve:
Scansione indice: tocca tutte le righe tranne alcune colonne.
Ricerca indice: tocca determinate righe e determinate colonne.
Con una scansione dell'indice, tutte le righe dell'indice vengono scansionate per trovare una riga corrispondente. Questo può essere efficiente per piccoli tavoli. Con una ricerca indice, è sufficiente toccare le righe che effettivamente soddisfano i criteri e quindi è generalmente più performante
Una scansione dell'indice si verifica quando la definizione dell'indice non può essere trovata su una singola riga per soddisfare i predicati di ricerca. In questo caso, SQL Server deve eseguire la scansione di più pagine per trovare un intervallo di righe che soddisfi i predicati di ricerca.
Nel caso di un Index Seek, SQL Server trova una singola riga che corrisponde ai predicati di ricerca utilizzando la definizione dell'indice .
Le ricerche indice sono migliori e più efficaci.
Una scansione tocca ogni riga della tabella anche se è quello che stai cercando o meno
Una ricerca guarda solo le righe che sono ciò che stai cercando.
È sempre meglio avere ricerche rispetto alle scansioni poiché sono più efficienti nel modo in cui cerca i dati.
Una buona spiegazione può essere trovata qui