2013-04-18 11 views
5

Sono giunto a questa conclusione che, come nei casi di seguito, cerca/scansiona ma non ho ricevuto perché esegue la scansione nel primo caso e cerca nel 2 ° caso. Ho capito il 3 ° caso.Indice su una colonna con modello simile e dove?

SELECT c.contactname FROM Sales.Customers c 
WHERE c.contactname LIKE '%a'-- Does a Scan 1st Case 

SELECT c.contactname FROM Sales.Customers c 
WHERE c.contactname LIKE 'a%'-- Does a Seek 2nd Case 

SELECT c.contactname FROM Sales.Customers c 
WHERE c.contactname LIKE '%a%'-- Does a Scan 

Se costruisco un indice su contactname che ha seguito i dati di esempio di come sarebbe l'albero dell'indice .. come noi se costruire per i numeri che a confronto meno di maggiore e farà attraversare come albero di indice essere trasversale nel caso di seguito.

c.contactname 

mark 
anna 
krishna 
nadejda 
allen 
bob 
cab 

risposta

4

Si fa una scansione nel primo caso per la stessa ragione come nel terzo caso: le ricerche nell'indice basati sui dati dall'inizio della stringa. Con un jolly all'inizio del tuo pattern, non c'è modo di cercare in modo intelligente l'indice per una corrispondenza. L'indice fa un confronto lessicale (alfabetico) per le stringhe, che è un confronto minore/maggiore del confronto.

L'albero potrebbe essere simile a questo:

 /nadejda 
    mark 
/ \krishna 
cab 
    \ /bob 
    anna 
     \allen 

Così, alla ricerca di a% può essere fatto, come l'indice saprà dove andare a ogni ramo. Ad esempio, C> A, quindi vai a sinistra. La ricerca di %a non è possibile in modo efficiente. L'indice dovrebbe leggere tutti i dati per capire se ogni nodo termina con A. Dovendo leggere tutti i dati significa che usare l'indice è solo un sovraccarico.

4

Questo è, in effetti, il modo in cui funziona SQL Server. Stai chiedendo perché.

Pensa all'indice. Funzionalmente, si può pensare a come memorizzare il contactname in ordine alfabetico - molto simile a un dizionario o rubrica. (Sì, di solito è una struttura dati più complicata, in genere un albero B, ma il risultato sono gli articoli in ordine).

Quando si dice contactname like 'a%', Query Optimizer sa che deve solo guardare le voci che iniziano con la lettera "a". L'indice sa esattamente dove sono, quindi l'ottimizzatore può usare una ricerca per raggiungerli. SQL Server implementa questa ottimizzazione per like (non tutti i database lo fanno).

Quando dici contactname like '%a', stai dicendo "trovami le voci che terminano in 'a'". È molto simile guardare attraverso un dizionario per ottenere tutte le parole che terminano in "a". L'ordine non è di alcun aiuto. Potrebbero esserci voci che iniziano con "a" e terminano con "a". Potrebbero esserci voci che iniziano con "z" e terminano con "a" .Questi tipi di espressioni richiedono una scansione anziché una ricerca

4

Ok, quindi operare una scomposizione per voi quando si crea l'indice sulla colonna stringa di caratteri. sarà memorizzarli dalla prima lettera in modo i dati sono memorizzati in questo modo.

allen 
anna 
bob 
cab 
krishna 
mark 
nadejda 

così, quando si sta facendo il vostro LIKE 'a%' Il server Sql può utilizzare l'indice per ridurre i risultati osservando l'ordine per tutto con una "A" all'inizio Tuttavia, una volta inserito il carattere jolly alla fine LIKE '%A', il motore è stato forzato a eseguire la scansione dell'intero t in grado di cercare qualsiasi cosa che termina con la lettera A.

Naturalmente questa è una spiegazione incredibilmente semplificata.

+1

* "guardando l'ordine per tutto ciò che ha una" A "all'inizio." * ...e fermandosi non appena trova una lettera che non inizia con ''a'' (ad esempio' bob' in questo esempio). –

Problemi correlati