2014-06-30 123 views
0

我被给予别人的代码连接9(!)表 - 我过去没有使用过它,但现在所有的表都随着时间增长,所以我收到奇怪的空间错误。单个语句中的多个内部连接与pairwise连接

我得到了建议,打破了连接,并做了多对配对连接。应该很简单,因为所有的连接都是内在的,我读的所有内容都表明顺序在这种情况下应该没有什么区别 - 但是我得到的数量与我应该的数量不同。没有给出任何特定的非常复杂的例子,这有什么可能的原因?

感谢

+0

你是什么意思两两连接。 – Hogan

+2

加入9张表并不是很多。 – Hogan

+0

“奇怪的空间错误”是什么意思? – Hogan

回答

0

To me, joining 9 tables in a single statement is a lot! Pairwise may have been imprecise - I mean joining two tables then joining that result to another table, then that result to another table. Obviously they are ordered to the degree that the necessary key is available at each point.

这不明摆着给我。事实上,这不是事实。 MOST SQL平台(并且你还没有说出你正在使用哪一个)编译SQL语句并形成一个执行计划。当连接执行时,该计划将优化并移动。在许多并行运行的系统上,它们将同时执行联接。

理解语句“顺序”的方法是查看执行计划。

控制订单(在许多系统上)的方法是使用CTE。事情是这样的:

WITH subsetofbigtable AS 
(
    SELECT * 
    FROM reallybigtable 
    WHERE date = '2014-01-01' 
) 
SELECT * 
FROM subsetofbigtable 
JOIN anothertable1 ... 
JOIN anothertable2 ... 
JOIN anothertable3 ... 
JOIN anothertable4 ... 
JOIN anothertable5 ... 

你也可以连接热膨胀系数以“订单”加入:

WITH subsetofbigtable AS 
(
    SELECT * 
    FROM reallybigtable 
    WHERE date = '2014-01-01' 
), chain1 AS 
(
    SELECT * 
    FROM subsetofbigtable 
    JOIN anothertable1 ... 
), chain2 AS 
(
    SELECT * 
    FROM chain1 
    JOIN anothertable2 ... 
) 
SELECT * 
FROM chain2 
JOIN anothertable3 ... 
JOIN anothertable4 ... 
JOIN anothertable5 ... 
+0

该平台是UNIX。我明白,优化发生在一个单一的声明,以便多个连接将被优化 - 即使如此,我有空间问题。所以当我试图打破连接并使用多个语句时,我只能加入任何我在此处具有密钥的表。 – user3791254

+0

@ user3791254 - UNIX ..很好。但没有帮助。你在使用DB2,Oracle,MySQL吗?什么是你的** SQL **平台。 – Hogan

+0

DB2 ...不熟悉“链接” – user3791254