试图使以下查询整洁并运行速度更快。任何见解都是有帮助的。我必须使用类似运算符,因为需要搜索现场任何地方的模式。
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中的支持,要么是实现的。
您可以使用 CTE
和 charindex
从您的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'