2013-03-18 69 views
1

Oracle 10g的64位 红帽企业Linux 5 64位如何有效地使用JOIN SQL外巨大的表连接

我现在有机会获得归一化的第三方数据库。这些数据量巨大,我的要求是通过加入很多表来公开一个Materialized VIEW。

表1:Example_Master 列:MasterID(VARCHAR2(250))MasterName(VARCHAR2(250)) 行数:90百万 主键:MasterID

表2:Example_ChildA1 列:ChildA1ID(VARCHAR2( 250))MasterID(VARCHAR2(250)) 行数:25百万

表3:Example_ChildA1ID 列:ChildA1ID(VARCHAR2(250))ChildA1Name(VARCHAR2(250)) 主键:ChildA1ID

表4:Example_ChildA2 列:ChildA2ID(VARCHAR2(250))MasterID(VARCHAR2(250)) 行数:35百万

表5:Example_ChildA2ID 列:ChildA2ID(VARCHAR2(250))ChildA2Name(VARCHAR2( 250)) 主键:ChildA2ID

等,

每个子表可以或可以不具有一个条目相当于MASTERID。所以我必须得到所有的MASTERID和它的相关的CHILD名字。如果没有任何孩子的等价值,那么它必须返回'NULL'。所以,我现在已经低于物化视图的语法

SELECT a.MasterName, c.ChildA1Name, e.ChildA2Name, g.ChildA3Name 
FROM 
Example_Master a, 
Example_ChildA1 b, 
Example_ChildA1ID c, 
Example_ChildA2 d, 
Example_ChildA2ID e, 
Example_ChildA3 f, 
Example_ChildA3ID g 
WHERE 
c.ChildA1ID(+) = b.ChildA1ID 
AND e.ChildA2ID(+) = d.ChildA2ID 
AND g.ChildA3ID(+) = f.ChildA3ID 
AND a.MasterID=b.MasterID (+) 
AND a.MasterID=d.MasterID (+) 
AND a.MasterID=f.MasterID (+) 

我不得不说,加入像上面5个孩子表和该查询的成本已经变得如此巨大,它需要近16分钟,得到的结果。有没有更好的方法来使用OUTER JOINS?如果您需要更多关于我的问题的详细信息,请告诉我。

谢谢!

+2

加入'VARCHAR'。这应该是很有趣的。 – Kermit 2013-03-18 17:02:54

+0

对不起。错误的列类型。 ID都是NUMBERS。表1:Example_Master列:MasterID(NUMBER)MasterName(VARCHAR2(250))行数:90 Million主键:MasterID 表2:Example_ChildA1列:ChildA1ID(NUMBER)MasterID(NUMBER)行数:25 Million 表3: :Example_ChildA1ID列:ChildA1ID(NUMBER)ChildA1Name(VARCHAR2(250))主键:ChildA1ID 表4:Example_ChildA2列:ChildA2ID(NUMBER)MasterID(NUMBER)行:35百万 表5:Example_ChildA2ID列:ChildA2ID(NUMBER )ChildA2Name(VARCHAR2(250))主键:ChildA2ID' – user2183200 2013-03-18 17:10:16

+2

首先放弃隐式语法。使用这是一个SDQL反模式。但是,个人来说,没有办法让这个速度更快。 YOu正在返回可能超过1亿行。当你需要它们时,你可以更好地进行个别查询,而不是这个庞大的视图。 – HLGEM 2013-03-18 17:15:14

回答

5

当你像这样等大连接大表时,你可以希望的最好的计划是一组哈希外连接,其成本通常等于全表扫描的成本加上大哈希表溢出的开销到磁盘。

只有覆盖索引时,才能真正减少全表扫描的成本。

哈希表溢出到磁盘的可能性当然会因为拥有大量可用内存而减少,但也可以通过在连接键上对表进行等分分区来帮助。通常,这是通过散列分区完成的,使用尽可能多的散列分区来防止散列表保留在内存中。更多来自文档:https://docs.oracle.com/cd/B28359_01/server.111/b32024/part_avail.htm#CIHCDBIF(或搜索“分区明智连接”)

请注意,您不需要使用并行查询以从分区明智的连接中受益 - 串行查询也有好处。

顺便提一下,感谢您不在10g以下版本 - 您无法有效地与LARGE_TABLE左外部连接小表进行同等连接,因为优化器无法首先访问小表创建一个哈希表 - 这将始终是一个嵌套循环:(

+0

到Oracle文档的链接不起作用。 – 2017-04-28 18:30:35

+0

@Mouad_S谢谢,修正。 – 2017-04-28 21:14:48