Esta pergunta está relacionada à minha pergunta antiga . A consulta abaixo estava demorando 10 a 15 segundos para executar:
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)
Em alguns artigos, vi que o uso CAST
e CHARINDEX
não se beneficiarão da indexação. Existem também alguns artigos que afirmam que o uso LIKE '%abc%'
não se beneficiará da indexação, enquanto LIKE 'abc%'
:
http://bytes.com/topic/sql-server/answers/81467-using-charindex-vs-like-where /programming/803783/sql-server-index-any-improvement-for -like-queries http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568
No meu caso, posso reescrever a consulta como:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE [company].dbo.[customer].[Phone no] LIKE '%123456789%'
Esta consulta fornece a mesma saída que a anterior. Eu criei um índice não clusterizado para a coluna Phone no
. Quando executo essa consulta, ela é executada em apenas 1 segundo . Esta é uma grande mudança em comparação com 14 segundos anteriormente.
Como se LIKE '%123456789%'
beneficia da indexação?
Por que os artigos listados afirmam que isso não melhora o desempenho?
Tentei reescrever a consulta para usar CHARINDEX
, mas o desempenho ainda é lento. Por que CHARINDEX
não se beneficia da indexação como parece que a LIKE
consulta faz?
Consulta usando CHARINDEX
:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [Company].dbo.[customer]
WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 )
Plano de execução:
Consulta usando LIKE
:
SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [Company].dbo.[customer]
WHERE[Company].dbo.[customer].[Phone no] LIKE '%9000413237%'
Plano de execução: