加入/子查询进退两难

时间:2012-03-04 23:13:14

标签: sql join subquery

我遇到了几个可以使用连接或子查询编写查询的实例。我通常使用连接,但有时使用子查询(没有任何理由)。我在几个地方(包括stackoverflow)读过,在许多情况下,连接比子查询更快,但有时子查询更快。现在我写的查询并没有处理大量的数据,所以我想速度并不是很重要。但是对于未来,我对以下内容感到好奇。

a。)为什么连接比子查询(通常)更快。

b。)子查询更快时的实例是什么。我怎么知道?

c。)如果我正在编写查询,我应该如何判断是否应该使用子查询或连接。如果有人用一个例子解释我,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

说连接比子查询“更快”并不是真的。这完全取决于使用的DBMS。

对于Microsoft SQL Server,我知道这不是真的。通常,表现相同。不仅在理论上,而且在实践中。

对于MySQL,我听说子查询有问题。我没有个人证据。

Oracle似乎与SQL Server大致相同。

答案 1 :(得分:2)

您的问题的答案。

a)连接不比子查询快(通常)。但是,如果使用连接,DBMS通常会生成更智能的执行计划。这与将查询转换为执行计划的过程有关。

b)c)一般而言,没有编写快速查询的规则。此外,只有一种方法可以为您的任务选择正确的查询:您必须对不同版本进行基准测试。因此,如果你必须决定如何制定一个特定的查询基准,如果它表现良好,那么停止。否则改变一些东西并再次对它进行基准测试,如果没问题,那就停下来吧。使用靠近生产环境的环境:使用真实的数据集。查询可能与数千条记录表现良好,但与数百万条记录不同。使用与生产中相同的硬件。考虑在应用程序的上下文中对查询进行基准测试,因为其他查询可能会影响它的性能。

答案 2 :(得分:1)

我所做的研究的主要原因是,当您明确说明如何进行连接时(即左连接,内连接等),编译器会更直接地使用正确的索引。如果使用子查询,你将它留给优化器,并不总是以最快的方式(它被称为'优化器'延迟)。

无论如何,编写子查询可能更容易,但是如果要构建一个速度和长期使用的查询,则明确表示应该写出显式连接。

以下是一些视图和示例的链接:

Join vs. Subquery

Another link这些提供了一些细节,为什么连接比子查询更快(在大多数情况下)。

more examples