2009-09-07 3 views
20

È consigliabile indicizzare le colonne varchar solo nelle operazioni LIKE? Da quello che posso leggere da analisi di query mi dalla seguente query:SQL Server: colonne dell'indice utilizzate in mi piace?

SELECT * FROM ClientUsers WHERE Email LIKE '%[email protected]%' 

ottengo un "costo stimato sottostruttura" di 0,38 senza alcun indice e 0,14, con un indice. Si tratta di una buona metrica da utilizzare per l'analisi se una query è stata ottimizzata con un indice?

risposta

48

sulla base dei dati 'abcdefg'

WHERE Column1 LIKE '%cde%' --can't use an index 

WHERE Column1 LIKE 'abc%' --can use an index 

WHERE Column1 Like '%defg' --can't use an index, but see note below 

Nota: Se avete domande importanti che richiedono '% defg', è possibile utilizzare una colonna persistente calcolata dove reverse() la colonna e poi indicizzarlo. Quindi è possibile interrogare su:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index 
+3

mi piace la vostra soluzione, anche se' d chiamarlo un brutto hack;) – idstam

+7

ho usato questo brutto hack su un sistema in cui il progettista originale fatto numeri char (x) con zeri e altri tasti lettera + zeri. prova a dire agli utenti che devono entrare negli zeri iniziali e/o + zeri iniziali! ha. vogliono entrare in 203, non in G000000203, quindi questo "hack" inverso ti aiuterà. –

+0

@ KM. fa riferimento questa risposta qui: http://dba.stackexchange.com/questions/91340/1-hour-query-is-there-another-way-to-do-this/91346#91346 – DForck42

8

Nella mia esperienza il primo% -sign farà qualsiasi indice inutile, ma alla fine sarà utilizzare l'indice.

+0

Abbastanza vicino - LIKE utilizzerà il prefisso su un indice ma non è possibile risolvere un carattere jolly tramite un indice in modo che sia il più possibile lungo. – ConcernedOfTunbridgeWells

+0

Quindi yay o no per gli indici su queste colonne? –

+1

Se si interroga sempre la colonna con una percentuale iniziale, l'indice non verrà mai utilizzato. La risposta dipende quindi da come si interrogano i dati. –

2

Per rispondere alla parte metriche della tua domanda: il tipo di indice di scansione/table/Seek in corso è un buon indicatore per sapere se un indice è in corso (correttamente) utilizzato. Di solito è mostrato in primo piano nell'analizzatore del piano di query. Il seguente scansione/cercano tipi sono ordinati dal peggiore (in alto) al meglio (in basso):

  • Table Scan
  • Clustered Index Scan
  • Index Scan
  • Clustered Index Seek
  • Index Seek

Come regola generale, che normalmente cercare di ottenere cerca più di scansioni, quando possibile. Come sempre, ci sono delle eccezioni a seconda delle dimensioni della tabella, delle colonne interrogate, ecc. Io raccomando di fare uno search on StackOverflow per "indice di ricerca scan" e riceverai molte informazioni utili su questo argomento.