使用 OR 时优化 SQL CONTAINS
Posted
技术标签:
【中文标题】使用 OR 时优化 SQL CONTAINS【英文标题】:Optimizing SQL CONTAINS while using OR 【发布时间】:2017-11-10 17:49:27 【问题描述】:在 SQL Server 2014 中,我尝试将 contains
用于几个不同的术语。该查询花费了非常长的时间,我很好奇分隔包含命令或在同一语句中使用它们是否更快。
例如,使用起来是否更快:
WHERE CONTAINS(text, '"term1" or "term2" or "term3"')
或
WHERE CONTAINS(text, "term1") OR CONTAINS(text, "term2") OR CONTAINS(text, "term3")
使用一个与另一个会有所不同,还是我可能在这里遗漏了一些更基本的东西?
更新:
我最终运行了第一个,但它在 50 分钟后出错(可能是单独的服务器连接问题)。我运行了第二个选项,查询在 19 分钟内完成。如果有人对为什么一个人的表现可能比另一个人有更好的答案,我仍然会感兴趣。谢谢。
【问题讨论】:
我会强烈打赌第一个。我从来没有尝试过。你可以测试一下。 即使我会推荐第一个,但我也从未尝试过 可能尝试再次运行第一个,因为索引可能已过期。您还可以检查执行计划以查看 (See Method 1 of the accepted answer in this post) 哪个查询会执行得更好。 【参考方案1】:在完成所有这些操作后,我注意到我在 SqlServer 2016 中执行了此测试 - 因此版本之间可能会有性能改进
我会说第一个是基于以下实验的更好的选择,但请注意,我是基于一组相对较小的测试数据,我所做的设置可能过于简化,但对于我认为它在理论上证明了为什么第一个应该更好。
您可以通过打开执行计划 (See Method 1 of the accepted answer in this post) 使用 Microsoft Management Studio 使用您自己的数据重复此测试
仅使用两个术语运行两个查询会执行以下操作:
正如您在第一个查询中看到的,68% 的成本用于扫描索引,32% 用于表函数(包含方法)。第二个,因为现在有两个函数调用要分析 - 表函数的成本增加了。以下是查询的时间安排。
-- 查询1
(296 行受影响)
SQL Server 执行时间: CPU 时间 = 0 毫秒,经过的时间 = 73 毫秒。
-- 查询2
(296 行受影响)
SQL Server 执行时间: CPU 时间 = 0 毫秒,经过的时间 = 100 毫秒。
如果我增加查询中的术语数量,您可以看到这对执行有何影响。
并给出时间安排:
-- 查询1
(441 行受影响)
SQL Server 执行时间: CPU 时间 = 0 毫秒,运行时间 = 80 毫秒。
-- 查询2
(441 行受影响)
SQL Server 执行时间: CPU 时间 = 0 毫秒,经过的时间 = 143 毫秒。
比较时间,第一种样式增加了 7 毫秒,而第二种样式增加了 43 毫秒 - 几乎增加了 50%。 两组之间的增加还表明,当您增加术语数量时,第一个查询样式的性能应该会更好。
【讨论】:
我今天再次尝试运行查询 1,让它完成它的工作。查询 1 在 01:40:29 用了将近两个小时 查询 2 用了 19 分钟。两个查询都从原来的 200,000,000 行返回了 13,000,000 行。你说的一切都很有道理,第一个似乎应该更快,但这就是我的结局。我不完全确定这里的要点是什么,但确实如此。谢谢。以上是关于使用 OR 时优化 SQL CONTAINS的主要内容,如果未能解决你的问题,请参考以下文章