多个连接语句实际上发生了什么?

What actually happens with multiple join statements?

我有一个关于 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) 中创建一个临时 table?

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

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

如果您内部连接多个 tables,连接的顺序由优化器决定,查询计划是根据知识(行数、收集的统计信息、唯一性)制定的。 一次只能连接两组数据,因此优化器将以二元关系拆分多个连接并尝试找到成本最低的计划。 Teradata 手册中有更多详细信息: planning n-way joins(以及上一页和下一页)

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

在 Teradata 的情况下,连接的结果将存储在所谓的 "spool" 中(如果不是太大则缓存)。

要查看实际计划,您可以 "Explain" 查询,方法是在查询前添加 Explain 或按 F6(在 SQL Assistant 和 TD Studio 中),这returns 该计划的相当冗长的文本表示。