【问题标题】:What actually happens with multiple join statements?多个连接语句实际上会发生什么?
【发布时间】:2015-07-19 21:18:18
【问题描述】:

我有一个关于 teradata 中的多个联接的广泛问题。

例如,我有:table1、table2、table3、table4。我想为他们所有人做一个INNER JOIN

所以:

SELECT a.*, b.*, c.*, d.* 
FROM table1 a 
JOIN table2 b ON a.acct_ID = b.acct_ID
JOIN table3 c ON a.acct_ID = c.acct_ID
JOIN table4 d ON a.acct_ID = d.acct_ID

那么这里发生的情况是,每次连接发生时,都会在此连续(((table 1+ table 2)+table 3)+table 4) 中创建一个临时表?

on 语句应该是 b.acct_ID = c.acct_IDc.acct_ID = d.acct_ID 以使语句高效,还是因为创建了临时表而这没有区别?

【问题讨论】:

  • 由数据库引擎决定。如果您没有获得所需的性能,请考虑优化。如果您在知道自己有问题之前尝试优化,您往往会发疯。这就像试图达到一个不断变化的需求目标......有多好就足够好......现在,如果您知道性能很差,那么请查看执行计划并找出最好的。

标签: sql join left-join inner-join teradata


【解决方案1】:

如果您对多个表进行内部连接,则连接顺序取决于优化器,会根据知识(行数、收集的统计信息、唯一性)开发查询计划。 一个步骤中只能连接两组数据,因此优化器将拆分二元关系中的多个连接并尝试找到成本最低的计划。 Teradata 手册中有更多详细信息: planning n-way joins(以及前页和后页)

令人印象深刻的是,用于优化连接的可能方法数量迅速增加,例如18,000,000,000 种不同的方式来进行 10 表连接: possible join orders

在 Teradata 的情况下,连接的结果将存储在所谓的“假脱机”中(如果不是太大,则缓存)。

要查看实际计划,您可以“解释”查询,方法是在查询前面添加Explain 或按 F6(在 SQL 助手和 TD Studio 中),这将返回计划的相当长的文本表示。

【讨论】:

    【解决方案2】:

    如果您想知道选择期间会发生什么,请查看execution plan

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 2020-02-18
      • 2020-04-29
      • 1970-01-01
      • 2013-06-21
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多