多个连接语句实际上发生了什么?
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_ID
和 c.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 该计划的相当冗长的文本表示。
我有一个关于 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_ID
和 c.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 该计划的相当冗长的文本表示。