子查询性能与连接

时间:2015-10-26 16:32:00

标签: sql sql-server-2008

我有数千个名为Assessment的记录表,它与Assessment_Review中的1个以上记录相关联。 当我使用join函数从Assessment表中检索评估审核结果时花了很多时间,但是当我使用子查询时它做得更好。

对于像这样的问题使用子查询是否可以?我读了很多文章,加入比大数据的性能中的子查询更好,但我发现它在我的情况下有所不同。或者我的数据可能不足以通过使用子查询来解决性能问题?

2 个答案:

答案 0 :(得分:1)

如果速度更快,那就去做吧!通过SQL调优,无论传统智慧如何,实际表现总是最好的。我会在子查询经验之前使用join来首先编写一个SQL select,但如果子查询提供更快的结果,则永远不要坚持。

作为旁注,找到一种方法告诉dbms如何首先获得一小部分行,这通常会带来更好的性能。假设您有一个包含10,000行的表a和包含100,000行的表b。您只希望表中的内容与表b的子集相等。如果您可以使用子查询或with语句将表b的大小限制为更小的行,比如1000行,然后告诉数据库加入表a,那么您的状态会好得多。换句话说,先限制,然后加入。

还有一件事,要小心优化具有小数据集的开发数据库中的查询...您可能会发现,当开发数据库拥有更多数据时,开发速度非常快。这是我唯一能想到用经验法则而不是实际表现更好的地方。

答案 1 :(得分:-1)

this article中的测试实际上导致建议在FROM子句中使用子查询 而不是仅使用JOIN(而不是在WHERE子句中使用它们)。这似乎基本上是正确的,但是,这是一个非常复杂的问题,每次遇到性能问题时都应该重新考虑。

编辑:文章正在引用MySQL,感谢你说得对。但是,我认为您需要在特定情况下检查两个选项的结论是相同的。我找到了一些关于SQL Server的文章(例如this one),我用相同的结论完成了它。