LIKE 查询优化

San*_*ana 2 sql-server optimization sql-server-2012

我有下表:

create table Order_Details
(
 ID int not null primary key
,Order_ID int
,Order_Description nvarchar(40)
)
Run Code Online (Sandbox Code Playgroud)

我们在上表中插入了 27,500,000 行,当我在查询下面运行时,它需要 6-7 秒。

select ID,Order_ID, Order_Description 
from Order_Details
where Order_Description  like '%Football Size%'
Run Code Online (Sandbox Code Playgroud)

我在Order_Description包含ID和应用了非聚集索引Order_ID

还有其他方法可以优化查询并以更快的方式获得结果吗?

Eri*_*ing 6

问题是双通配符在 SQL Server 中'%string searches%'慢,因为我们本机没有花哨的三元组搜索。

即使在字符串搜索列上有一个索引,我们也必须读取每一行。

CREATE NONCLUSTERED INDEX ix_displayname ON dbo.Users(DisplayName)

SELECT u.Id, u.Reputation, u.DisplayName
FROM dbo.Users AS u 
WHERE u.DisplayName LIKE '%Christopher%'
Run Code Online (Sandbox Code Playgroud)

坚果

如果您只搜索一个字符串(从来都不是这种情况),或者您有一组有限的已知搜索字符串,则索引计算列(或多个列)可能对您有利。

ALTER TABLE dbo.Users ADD SearchString 
    AS CONVERT(BIT, CASE WHEN DisplayName LIKE '%Christopher%' THEN 1 ELSE 0 END)

CREATE INDEX ix_yourmom ON dbo.Users (SearchString)
Run Code Online (Sandbox Code Playgroud)

否则,您将不得不想出一种更好的方法来定位不涉及搜索文本的数据,例如OrderLines按照可以在 ID 上搜索的顺序跟踪每个项目的表格。