我有一个以下查询占用了大量时间: -
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%
时,索引不能正常工作。
关于如何加快速度的任何想法?
答案 0 :(得分:6)
你是对的......带有通用通配符的查询糟糕以提高性能。为了解决这个问题,Sql Server有一个名为full text search的东西。您为要搜索的每个列创建一个特殊的FULL TEXT Index,然后更新您的代码以使用CONTAINS keyword:
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
(
Contains(p.City, @search)
or Contains(p.Address1, @search)
or Contains(p.Address2, @search)
or Contains(p.State, @search)
or Contains(park.Name, @search)
or Contains(p.ZipCode, @search)
)
AND (@usOnly = 0 or (p.CrmCountryId = @USA_COUNTRY_ID))
不幸的是,所有这些OR条件仍然可能会让它变得非常缓慢,并且FULL TEXT并不是针对像City或State这样的较短字符串,或者像这样投射宽网。您可能会发现,通过与Solr或ElasticSearch等工具集成,您可以更好地进行此类搜索。除了编写更好,更快的搜索之外,这些工具还可以帮助您创建理智的排名,以便按照有意义且与输入相关的顺序返回结果。
另一种策略是创建一个计算列,将地址和名称文本连接成一个列,然后在一个字段上执行一个FULL TEXT索引,并使用一个CONTAINS()调用。