优化包含Like运算符的SQL查询

时间:2018-02-16 01:14:48

标签: sql sql-server query-optimization ssms

尝试使以下查询整洁并且运行得更快。任何见解都有帮助。我必须像操作员一样使用,因为需要在现场的任何地方搜索模式。

Select Col1,Col2,Col3 from TableName where
   (Subject like '%Maths%' OR
    Subject like '%Physics%' OR
    Subject like '%Chemistry%' OR
    Subject like '%English%')
    AND
    (Description like '%Maths%' OR
    Description like '%Physics%' OR
    Description like '%Chemistry%' OR
    DESCRIPTION like '%English%')
    AND
    (Extra like '%Maths%' OR
    Extra like '%Physics%' OR
    Extra like '%Chemistry%' OR
    Extra like '%English%') AND Created Date > 2017-01-01

2 个答案:

答案 0 :(得分:1)

基本上,您无法使用基本SQL优化此查询。如果您要搜索的字符串是文本中的单词,则可以使用全文字符串。开始学习这个的地方是documentation

如果您碰巧知道将要搜索这四个字符串,则可以设置计算列,然后在计算列上构建索引。那会很快。但是你将被限制在那些字符串中。

一切都不会丢失。从技术上讲,还有其他解决方案,例如基于n-gram或转换为XML / JSON并对其进行索引的解决方案。但是,这些要么在SQL Server中不受支持,要么在实现时不重要。

答案 1 :(得分:0)

您可以使用CTEcharindex

尝试此操作

比较OP的执行计划。

;with mycte as (   --- building words to look for
 select * from
  (values ('English'),
    ('Math'),
    ('Physics'),
    ('English'),
    ('Chemistry')
  ) t (words)
)
select t.* from
tablename t 
inner join mycte c
 on charindex(c.words,t.subject) > 0    --- check if there is a match
 and charindex(c.words,t.description) > 0  --- check if there is a match
 and charindex(c.words,t.extra) > 0   --- check if there is a match
where
t.createddate > '2017-01-01'