【问题标题】:Join table vs Join Subquery - which is more efficient?联接表与联接子查询 - 哪个更有效?
【发布时间】:2020-01-28 11:43:00
【问题描述】:

我最近浏览了很多 SQL 代码,其中 Join 部分填充了复杂的子查询,并开始想知道加入带有有限列选择的子查询与加入整个表并只选择必要的列是否有任何好处。

为了说明这一点:

假设我们有 2 个表:Table1, Table2,每个表都有 (PK, FK, a, b ,c, d, e, f) 列。 我想将 Table1 与 Table2 连接起来,但只从 Table2 中检索几个字段。

哪个更高效,每个有什么好处?

SELECT 
  Table1.*,
  Table2.a,
  Table2.b

FROM Table1
LEFT JOIN Table2 ON Table1.PK = Table2.FK

SELECT
  Table1.*,
  Table2sub.*

FROM Table1
LEFT JOIN (SELECT FK, a, b FROM Table2) AS Table2sub ON Table1.PK = Table2sub.FK

【问题讨论】:

  • “哪个更有效” 测试这些语句会很快给你答案。你发现了什么?
  • 如果您接受 Gordon 关于性能的回答,那么需要注意的是,第一个 更易于阅读
  • @GeorgeMenoutis 就是这样 - 我认为糟糕的可读性必须牺牲一些收益(可能是效率)。

标签: sql sql-server subquery


【解决方案1】:

SQL 是一种描述性 语言,而不是一种过程 语言。也就是说,SQL 查询描述的是结果集的样子,而不是如何产生结果。

事实上,引擎运行的内容称为有向无环图 (DAG),它看起来一点也不像查询。 SQL 引擎首先解析查询,然后对其进行编译,然后对其进行优化以生成 DAG。

SQL Server 有一个很好的优化器。它不会被子查询混淆。一些 SQL 编译器并不那么聪明,并且会实现子查询——这可能会对性能产生很大影响。

如果您查看执行计划,您会发现在这种情况下它们是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多