To pytanie dotyczy mojego starego pytania . Wykonanie poniższego zapytania trwało od 10 do 15 sekund:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE (Charindex('123456789',CAST([company].dbo.[customer].[Phone no] AS VARCHAR(MAX)))>0)
W niektórych artykułach widziałem, że używanie CAST
i CHARINDEX
nie skorzysta z indeksowania. Istnieje również kilka artykułów, które mówią, że używanie LIKE '%abc%'
nie skorzysta z indeksowania, podczas gdy LIKE 'abc%'
:
http://bytes.com/topic/sql-server/answers/81467-using-charindex-vs-like-where /programming/803783/sql-server-index-any-improvement-for podobne zapytania http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568
W moim przypadku mogę przepisać zapytanie jako:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE [company].dbo.[customer].[Phone no] LIKE '%123456789%'
To zapytanie daje takie same wyniki jak poprzednie. Utworzyłem indeks nieklastrowany dla kolumnyPhone no
. Kiedy wykonuję to zapytanie, działa ono w ciągu zaledwie 1 sekundy . To ogromna zmiana w porównaniu z 14 sekundami wcześniej.
Jakie są LIKE '%123456789%'
korzyści z indeksowania?
Dlaczego wymienione artykuły stwierdzają, że nie poprawi to wydajności?
Próbowałem przepisać zapytanie, aby użyć CHARINDEX
, ale wydajność jest wciąż niska. DlaczegoCHARINDEX
nie korzysta z indeksowania, jak się wydaje, że LIKE
zapytanie?
Zapytanie za pomocą CHARINDEX
:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [Company].dbo.[customer]
WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 )
Plan wykonania:
Zapytanie za pomocą LIKE
:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [Company].dbo.[customer]
WHERE[Company].dbo.[customer].[Phone no] LIKE '%9000413237%'
Plan wykonania:
źródło
30%
), może spojrzeć naLIKE
dostarczony wzorzec i statystyki podsumowania ciągów i uzyskać dokładniejsze oszacowanie. Uzbrojony w to może wybrać inny, bardziej odpowiedni plan.