2015-01-16 75 views
5

Jeśli [kolumna1] jest indeksowana, kolejna kwerenda może korzystać index:T-SQL jak przy użyciu zmiennej i indeks

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

Gdybym wprowadzić zmienną, zapytanie poniżej nigdy nie będzie używać index:

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

Chcę zaimplementować wyszukiwanie startswith na podstawie danych wprowadzonych przez użytkownika, a nie jestem pewien jaki sposób wybrać:

  1. wejściowe użytkownika ucieczka prawidłowo Podobnie jak dla optymalizator będzie w stanie odebrać plan opiera się na dosłownym

  2. pomocą (FORCESEEK)

  3. użyć opcji (rekompilacji)
+0

Inną opcją jest zaglądanie do wyszukiwania pełnotekstowego. – Mihai

+2

Dlaczego drugie zapytanie nie będzie korzystać z indeksu? – Lock

+0

Nie planuję utrzymania indeksu wyszukiwania pełnotekstowego na teraz – svolkov

Odpowiedz

4

Nie ma innego wyboru, że nie listy. Możesz użyć opcji OPTIMIZE FOR, aby zmusić optymalizator zapytań do poprawnego założenia o charakterze oczekiwanych wartości zmiennych. Wydaje się, że to bardzo dobrze pasuje do twojej potrzeby.

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

Jest to opisane bardziej szczegółowo w this blog. Istnieje również MSDN documentation.

Nakazuje optymalizatorowi zapytań użycie konkretnej wartości lokalnej zmiennej , gdy zapytanie jest kompilowane i optymalizowane. Wartość jest używana tylko podczas optymalizacji zapytania, a nie podczas wykonywania kwerendy.

+0

Muszę właściwie uciec przed wprowadzeniem przez użytkownika w instrukcji OPTIMIZE FOR, tak czy inaczej, prawda? – svolkov

+0

Właśnie przetestowałem to na AdventureWorks2008 i to nie działa :(. ['QUERY'] (http://tinypic.com/r/2nkl17d/8) i [' PLIKÓW WYKONANIA'] (http: // tinypic .com/r/4htpqb/8) –

+0

Testowałem i działa, ale nie widzę żadnej korzyści przed pierwszym wyborem – svolkov