Piani di SQL Server: differenza tra Index Scan / Index Seek


89

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:


129

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.

  • In generale una ricerca di indice è preferibile a una scansione di indice (quando il numero di record corrispondenti è proporzionalmente molto inferiore al numero totale di record), poiché il tempo impiegato per eseguire una ricerca di indice è costante indipendentemente dal numero totale di record nel tuo tavolo.
  • Si noti tuttavia che in determinate situazioni una scansione dell'indice può essere più veloce di una ricerca dell'indice (a volte significativamente più veloce), di solito quando la tabella è molto piccola o quando una grande percentuale dei record corrisponde al predicato.

3
Il collegamento è ancora attivo? per me non funziona. Si prega di aiutare se c'è un collegamento aggiornato
Ronak Agrawal

2
@RonakAgrawal Sembra che il collegamento sia effettivamente morto - forse invece controllare su Wikipedia ?
Justin


77

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 ....


7

Risposta breve:

  • Scansione indice: tocca tutte le righe tranne alcune colonne.

  • Ricerca indice: tocca determinate righe e determinate colonne.


4

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


2

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.


0

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


3
Le ricerche non sono sempre migliori, ad esempio se la tabella è relativamente piccola e deve essere restituita una grande percentuale delle righe in quella tabella, una scansione dell'indice può risultare molto più efficiente.
Justin

1
Ciao Justin, immagino tu voglia dire che alcune volte le scansioni dei tavoli possono essere migliori. La ricerca degli indici è sempre migliore di una scansione degli indici a meno che non si parli di cluster. Ma, a volte, una scansione della tabella o una scansione dell'indice cluster può essere più efficiente per il motivo che hai menzionato. Invece di cercare l'indice e ottenere i campi non sono nell'indice dalla tabella, a volte, ms sql utilizzerà la tabella anche se l'indice ha il campo dei criteri.
Jose Areas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.