【问题标题】:Joins / Sub queries dilemma联接/子查询困境
【发布时间】:2012-03-04 23:13:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql join subquery


    【解决方案1】:

    说连接比子查询“大多更快”是不正确的。这完全取决于所使用的 DBMS。

    对于 Microsoft SQL Server,我知道这不是真的。通常,性能是一样的。不仅在理论上,而且在实践中。

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

    Oracle 似乎和 SQL Server 差不多。

    【讨论】:

    • 感谢您的回答。在我编写查询之前,判断应该使用联接还是使用子查询的最佳方法是什么。对于任何 dbms。你是怎么判断的?
    • 无法判断任何dbms。请告诉我们一个具体的。
    • 说 MySQL。我的意思是你如何决定什么时候做。或者是这个 DBMS 使用连接这个 DBMS 使用子查询等
    • 如果查询的性能依赖于数据库并且我们从一个数据库迁移到另一个数据库,是否意味着如果我们的数据库很大,我们必须完全重写查询。
    • 哦,这是真的!在这种情况下,您应该非常喜欢连接!
    【解决方案2】:

    您的问题的答案。

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

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

    【讨论】:

      【解决方案3】:

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

      无论如何,编写子查询可能更容易,但如果您正在构建一个快速和长期使用的查询,那么显然您应该写出显式连接。

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

      Join vs. Subquery

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

      more examples

      【讨论】:

      • 您的链接特定于 SQL-Server、MySQL 和 DB2。它们通常与 SQL 和 Join-vs-subqueries 性能无关。
      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多