【问题标题】:JOIN whole tables vs JOIN tables with less columns (fetched via subquery)JOIN 整个表与 JOIN 列较少的表(通过子查询获取)
【发布时间】:2013-03-12 12:29:37
【问题描述】:

如果我要在两个表之间进行连接,那么我将它们作为一个整体连接,或者我在仅提取所需的列之后加入它们(假设每个表可能有很多列)?

例如,是

SELECT tableA.foreignKey, tableB.someValue
FROM tableA JOIN tableB ON tableA.foreignKey=tableB.key

任何不同的

SELECT tableA.foreignKey, tableB.someValue 
FROM (SELECT foreignKey FROM tableA) tableA_filtered 
JOIN (SELECT key, someValue FROM tableB) tableB_filtered 
ON tableA_filtered.foreignKey=tableB_filtered.key

性能方面?

【问题讨论】:

  • 查询优化器告诉你什么?
  • @PeterLang 我编辑了问题中的查询,使其更加正式,因此更有意义。

标签: sql performance join


【解决方案1】:

使用第一个,因为第二个使用为结果创建临时表的子查询。实际上(SELECT valueA FROM tableA) 根本没有意义,因为您没有聚合表格上的某些列。

子查询有时是邪恶的,并非总是如此。 Tt 取决于您使用的 RDBMS。

【讨论】:

  • MS SQL 通常会优化子查询,这样就不会造成性能损失(尽管第一个查询看起来更好,易于维护等)。确定查询计划需要比较以获得特定案例的正确答案。
  • @Arvo 我完全同意,但我不确定 OP 使用的是什么......呵呵
  • 我正在使用 oracle,但我认为这可能是一个相当普遍的问题,因为也许大多数供应商都遵循相同的基线——但这只是一个假设
【解决方案2】:

一般规则是子查询总是很慢。 根据您正在处理的数据量,它可能会产生很大的影响。

Reciently 我从一个包含很多连接的大型选择中删除了一个子查询。 SQL 正在处理大约 100,000 行,如果不是更多的话。 删除非常简单的子选择将性能提高了 50 秒。 总体而言,sql 需要两分钟。所以影响很大。

【讨论】:

    【解决方案3】:

    我认为在表有很多列的情况下,第二个查询可能会更快。但重要的是要注意这两个查询是不等价的。第一个显示来自 A 和 B 的所有值,第二个仅显示来自 A 的 valueA 和来自 B 的 valueB!无论如何,这更像是一个理论问题,一般很难回答。

    实际上,我会将这个决定留给数据库优化器。但是,如果您真的想知道是否有办法让它变得更快,唯一安全的方法是测量和比较两个查询的运行时间。

    作为旁注,第二个查询很可能会被 DBMS 的重写引擎展平,所以它和你写的时候一样:

    从 A、B 中选择 valueA、valueB,其中 A.valueA = B.valueB;

    【讨论】:

    • 我编辑了查询以使它们返回相同的结果(但这不是问题的重点)
    • 在这种情况下,应该是完全一样的。对于第一个查询,优化器将下推您的选择语句。其次,重写引擎将首先展平您的查询,然后优化器也会这样做!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多