我遇到了几个可以使用连接或子查询编写查询的实例。我通常使用连接,但有时使用子查询(没有任何理由)。我在几个地方(包括stackoverflow)读过,在许多情况下,连接比子查询更快,但有时子查询更快。现在我写的查询并没有处理大量的数据,所以我想速度并不是很重要。但是对于未来,我对以下内容感到好奇。
a。)为什么连接比子查询(通常)更快。
b。)子查询更快时的实例是什么。我怎么知道?
c。)如果我正在编写查询,我应该如何判断是否应该使用子查询或连接。如果有人用一个例子解释我,我将不胜感激。
答案 0 :(得分:3)
说连接比子查询“更快”并不是真的。这完全取决于使用的DBMS。
对于Microsoft SQL Server,我知道这不是真的。通常,表现相同。不仅在理论上,而且在实践中。
对于MySQL,我听说子查询有问题。我没有个人证据。
Oracle似乎与SQL Server大致相同。
答案 1 :(得分:2)
您的问题的答案。
a)连接不比子查询快(通常)。但是,如果使用连接,DBMS通常会生成更智能的执行计划。这与将查询转换为执行计划的过程有关。
b)c)一般而言,没有编写快速查询的规则。此外,只有一种方法可以为您的任务选择正确的查询:您必须对不同版本进行基准测试。因此,如果你必须决定如何制定一个特定的查询基准,如果它表现良好,那么停止。否则改变一些东西并再次对它进行基准测试,如果没问题,那就停下来吧。使用靠近生产环境的环境:使用真实的数据集。查询可能与数千条记录表现良好,但与数百万条记录不同。使用与生产中相同的硬件。考虑在应用程序的上下文中对查询进行基准测试,因为其他查询可能会影响它的性能。
答案 2 :(得分:1)
我所做的研究的主要原因是,当您明确说明如何进行连接时(即左连接,内连接等),编译器会更直接地使用正确的索引。如果使用子查询,你将它留给优化器,并不总是以最快的方式(它被称为'优化器'延迟)。
无论如何,编写子查询可能更容易,但是如果要构建一个速度和长期使用的查询,则明确表示应该写出显式连接。
以下是一些视图和示例的链接:
Another link这些提供了一些细节,为什么连接比子查询更快(在大多数情况下)。