繁体   English   中英

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

[英]Optimize SQL Query containing Like Operator

尝试使以下查询更整洁并运行得更快。 任何见解都是有帮助的。 我需要使用类似Operator的方法,因为需要在字段中的任何位置搜索模式。

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM