如何在SQL Server中使LIKE'%Search%更快

Sai*_*and 3 sql-server

我有一个下面的查询,它占用很多时间:-

 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%

关于如何使其更快的任何想法?

Joe*_*orn 6

您是对的...使用领先的通配符进行查询对于性能而言非常糟糕。为了解决这个问题,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)

不幸的是,所有这些“或”条件仍然可能使此操作变慢,并且“全文本”并没有像“城市”或“州”这样的较短字符串或此类的宽网一样。您可能会发现,通过与SolrElasticSearch之类的工具集成,可以更好地进行这种搜索。除了编写更好,更快的搜索之外,这些工具还将帮助您创建合理的排名,以便按有意义的顺序返回与输入相关的结果。

另一种策略是创建一个计算列,该列将您的地址和名称文本连接到单个列中,然后通过单个CONTAINS()调用对该字段进行单个FULL TEXT索引。