我有一个下面的查询,它占用很多时间:-
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))
Run Code Online (Sandbox Code Playgroud)
我已经读到索引在使用时效果不佳LIKE '%Search%。
关于如何使其更快的任何想法?
您是对的...使用领先的通配符进行查询对于性能而言非常糟糕。为了解决这个问题,Sql Server提供了一种称为全文搜索的功能。您为要搜索的每一列创建一个特殊的全文索引,然后更新代码以使用CONTAINS关键字:
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))
Run Code Online (Sandbox Code Playgroud)
不幸的是,所有这些“或”条件仍然可能使此操作变慢,并且“全文本”并没有像“城市”或“州”这样的较短字符串或此类的宽网一样。您可能会发现,通过与Solr或ElasticSearch之类的工具集成,可以更好地进行这种搜索。除了编写更好,更快的搜索之外,这些工具还将帮助您创建合理的排名,以便按有意义的顺序返回与输入相关的结果。
另一种策略是创建一个计算列,该列将您的地址和名称文本连接到单个列中,然后通过单个CONTAINS()调用对该字段进行单个FULL TEXT索引。
| 归档时间: |
|
| 查看次数: |
1948 次 |
| 最近记录: |