2015-01-16 8 views
5

Se [Colonna1] è indicizzato, query successiva può utilizzare index:T-SQL come l'utilizzo variabile e l'indice

SELECT * FROM [table] WHERE [column1] LIKE 'starts%' 

Se presento una variabile, la domanda sotto userà mai index:

DECLARE @starts nvarchar(100) 
SET @starts = 'starts%' 
SELECT * FROM [table] WHERE [column1] LIKE @starts 

voglio realizzare StartsWith ricerca in base all'input dell'utente e non sono sicuro di quale modo di scegliere:

  1. input dell'utente fuga correttamente per questo modo ottimizzatore sarà in grado di scegliere un piano basato su letterale

  2. uso con (FORCESEEK)

  3. uso OPTION (RECOMPILE)
+0

Un'altra opzione è quella di guardare in ricerca full-text. – Mihai

+2

Perché la seconda query non dovrebbe utilizzare un indice? – Lock

+0

Non ho intenzione di mantenere la piena indice di ricerca per ora – svolkov

risposta

4

C'è un'altra scelta non è stata elencare. È possibile utilizzare l'opzione OPTIMIZE FOR per forzare l'ottimizzatore di query per rendere la giusta ipotesi circa la natura dei valori delle variabili attesi. Questo sembra adattarsi molto bene alle tue esigenze.

DECLARE @starts nvarchar(100) 
SET @starts = 'starts%' 
SELECT * FROM [table] WHERE [column1] LIKE @starts 
OPTION (OPTIMIZE FOR (@starts = 'mnopq%')) 

È descritto in dettaglio in this blog. C'è anche il MSDN documentation.

Indica a Query Optimizer di utilizzare un valore particolare per una variabile locale quando la query viene compilata e ottimizzata. Il valore viene utilizzato solo durante l'ottimizzazione delle query, e non durante l'esecuzione di query.

+0

devo scappare correttamente l'input dell'utente all'interno OPTIMIZE FOR comunque, giusto? – svolkov

+0

Ho appena testato questo su AdventureWorks2008 e non funziona :([ 'query'] (http://tinypic.com/r/2nkl17d/8) e [' ESECUZIONE PLANS'] (http: //. Tinypic .com/r/4htpqb/8) –

+0

ho provato e funziona, tuttavia non vedo alcun vantaggio prima della 1a scelta – svolkov