【发布时间】:2016-07-26 21:00:12
【问题描述】:
我有一个占用大量时间的查询:-
SELECT
p.CrmId,
park.Name
FROM
Property p
INNER JOIN
Som som ON som.CrmId = p.SystemOfMeasurementId
LEFT JOIN
Park park ON park.CrmId = p.ParkId
WHERE
((p.City like '%' + @search + '%' )
OR (p.Address1 like '%' + @search + '%')
OR (p.Address2 like '%' + @search + '%' )
OR (p.State like '%' + @search + '%' )
OR (park.Name like '%' + @search + '%' )
OR (p.ZipCode like '%' + @search + '%')
)
AND (@usOnly = 0 or (p.CrmCountryId = @USA_COUNTRY_ID))
我了解到,当我们使用 LIKE '%Search% 时,索引无法正常工作。
关于如何使这更快的任何想法?
【问题讨论】:
-
你可能不走运
-
你应该看看fulltext index/search这样的东西,你可能会得到更好的匹配和速度。
-
即使使用 FTS,如果您在字符串的开头使用通配符搜索也会很慢。如果您使用搜索参数搜索每个单词的开头,那么 FTS 可以为您提供所需的速度。示例:带有值 Win 的 @search 应该匹配地址“123 Window lane”,而不是“123 LikWin”。请参阅此previous answer 作为如何使用 FTS 编写查询的示例,您将需要在列上构造目录和索引。您还可以调整索引的填充/搜索方式。
-
全文搜索是您唯一的希望。当您使用前导通配符时,您消除了索引进行查找的能力。想想电话簿。如果您想要所有以“S”开头的姓氏,查找起来非常简单快捷。但是,如果您希望所有姓氏都包含“S”....那么您必须查看书中的每个条目以确定它是否匹配。这是对 sql 索引的高级解释。
-
@Igor FTS 可以设置为除索引单词之外的字符。
标签: sql-server