这个问题与我的旧问题有关。以下查询需要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-queries 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%'
此查询提供与上一个相同的输出。我为column创建了一个非聚集索引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%'
执行计划: