如何在SQL Server中使LIKE'%搜索速度更快

时间:2016-07-26 21:00:12

标签: 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))

我已经读过,当我们使用LIKE '%Search%时,索引不能正常工作。

关于如何加快速度的任何想法?

1 个答案:

答案 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这样的较短字符串,或者像这样投射宽网。您可能会发现,通过与SolrElasticSearch等工具集成,您可以更好地进行此类搜索。除了编写更好,更快的搜索之外,这些工具还可以帮助您创建理智的排名,以便按照有意义且与输入相关的顺序返回结果。

另一种策略是创建一个计算列,将地址和名称文本连接成一个列,然后在一个字段上执行一个FULL TEXT索引,并使用一个CONTAINS()调用。