2012-03-04 66 views
1

我遇到了几个可以使用联接或子查询来编写查询的实例。我通常使用连接,但有时使用子查询(没有任何理由)。我已经在几个地方(包括stackoverflow)读过,在许多情况下连接速度都比子查询要快,但有时子查询速度会更快。现在我写的查询并不涉及大量的数据,所以我估计速度并不是什么大问题。但对于未来,我对以下内容感到好奇。联接/子查询困境

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

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

c。)如果我正在写一个查询,我应该如何判断我应该使用子查询还是联接。如果有人用一个例子来解释我,我会很感激。

回答

2

您的问题的答案。

a)连接速度不及子查询(一般)。但是,如果您使用连接,DBMS通常会生成更加智能的执行计划。这与查询转化为执行计划的两个过程有关。

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

1

从研究我做的主要原因是,编译器更直接地利用正确的索引,当你明确说明如何做加盟(即左连接,内连接等),如果你使用一个子查询,你会让它稍微优化一下,它并不总是以最快的方式(它被称为“优化器”而被推迟)。

不管怎么说,这可能是更容易编写你的子查询,但如果你正在建设的速度和长期使用的查询,其明确表示,你应该写出来的明确连接。

这里有一些观点和例子一些链接:

Join vs. Subquery

Another link这的人给出了一些比子查询的详细信息,为什么连接速度更快(在大多数情况下)。

more examples

+0

您的链接特定于SQL-Server,MySQL和DB2。它们通常不涉及SQL和Join-vs-subqueries的性能。 – 2012-03-04 23:53:37

3

说,加入“基本上是”快比子查询是不正确的。这完全取决于所使用的DBMS。

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

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

Oracle似乎与SQL Server差不多。

+0

感谢您的回答。在我编写查询之前,最好的方法是判断是使用连接还是应该使用子查询。对于任何dbms。你如何判断? – Ank 2012-03-05 00:16:34

+0

无法判断任何dbms。请告诉我们一个具体的。 – usr 2012-03-05 00:17:27

+0

说MySQL。我的意思是你怎么决定什么时候做。或者它是否为这个DBMS使用这个DBMS的连接使用子查询等 – Ank 2012-03-05 00:34:50