优化包含类似运算符的SQL查询



试图使以下查询整洁并运行速度更快。任何见解都是有帮助的。我必须使用类似运算符,因为需要搜索现场任何地方的模式。

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

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

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

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

您可以使用 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'

最新更新