Це питання пов'язане з моїм старим питанням . Наведений нижче запит знадобився від 10 до 15 секунд:
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)
У деяких статтях я бачив, що використання CAST
та CHARINDEX
не буде користі від індексації. Також є деякі статті, які говорять про те, що використання LIKE '%abc%'
індексації не піде на користь LIKE 'abc%'
:
http://bytes.com/topic/sql-server/answers/81467-using-charindex-vs-like-where /programming/803783/sql-server-index-any-improvement-for -like-запити http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568
У моєму випадку я можу переписати запит як:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE [company].dbo.[customer].[Phone no] LIKE '%123456789%'
Цей запит дає такий же вихід, як і попередній. Я створив некластеризований індекс для стовпця Phone no
. Коли я виконую цей запит, він запускається всього за 1 секунду . Це величезна зміна порівняно з 14 секундами раніше.
Як отримує LIKE '%123456789%'
користь від індексації?
Чому перераховані статті стверджують, що це не покращить ефективність роботи?
Я спробував переписати запит для використання CHARINDEX
, але продуктивність все ще повільна. Чому CHARINDEX
індексація не виграє, як видається, LIKE
запит?
Запит із використанням CHARINDEX
:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [Company].dbo.[customer]
WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 )
План виконання:
Запит із використанням LIKE
:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [Company].dbo.[customer]
WHERE[Company].dbo.[customer].[Phone no] LIKE '%9000413237%'
План виконання: