ORACLE连接多个表的性能

时间:2018-03-16 21:48:27

标签: sql oracle join query-performance

我有点复杂的问题。 假设我有7个表(每个20mil +行)(表1,表2 ...)和相应的pk(pk1,pk2,....)(所有表中的基数为1:1) 我想把我的决赛桌(使用散列连接)作为:

Create table final_table as select   
t1.column1,  
t2.column2,  
t3.column3,  
t4.column4,  
t5.column5,  
t6.column6,  
t7.column7  
from table1 t1  
join table2 t2 on t1.pk1 = t2.pk2  
join table2 t3 on t1.pk1 = t3.pk3   
join table2 t4 on t1.pk1 = t4.pk4     
join table2 t5 on t1.pk1 = t5.pk5  
join table2 t6 on t1.pk1 = t6.pk6  
join table2 t7 on t1.pk1 = t7.pk7

我想知道创建局部表然后是最终表会更快吗?

Create table partial_table1 as select   
t1.column1,  
t2.column2  
from table1 t1  
join table2 t2 on t1.pk1 = t2.pk2



create table partial_table2 as select   
t1.column1, t1.column2  
t3.column3  
from partial_table1 t1  
join table3 t3 on t1.pk1 = t3.pk3



create table partial_table3 as select  
t1.column1, t1.column2, t1.column3   
t4.column4   
from partial_table1 t1   
join table3 t4 on t1.pk1 = t4.pk4



...  
...  
... 

我知道这取决于RAM(因为我想使用散列连接),实际的服务器使用情况等等。我不是在寻找具体的答案,我正在寻找一些解释为什么以及在什么情况下它会更好使用部分结果或为什么在1选中使用所有7个连接会更好。
谢谢,我希望我的问题很容易理解。

2 个答案:

答案 0 :(得分:1)

通常,创建临时表并不是更好。 SQL引擎有一个优化阶段,这个优化阶段应该很好地确定最佳查询计划。

在一堆连接的情况下,这主要是关于连接顺序,索引的使用和最优算法。

这是一个很好的默认态度。这是否意味着临时表永远不会对性能优化有用?一点也不。以下是一些例外情况:

  • 优化程序生成次优查询计划。在这种情况下,查询提示可以将优化器推向正确的方向。而且,临时表可以提供帮助。
  • 索引临时表。有时,临时表上的索引可能是性能的一大胜利。优化器可能不会选择它。
  • 跨查询重用临时表。

对于使用散列连接的特定目标,您可以使用查询提示来确保优化程序执行您想要的操作。我应该注意,如果连接在主键上,那么散列连接可能不是最佳算法。

答案 1 :(得分:0)

在数据库中创建临时表不是一个好主意。为了报告目的而优化您的查询或使用视图尝试更快的结果,它可以带来更好的结果。

对于您的具体情况,您想要使用散列连接,请稍微解释一下,为什么您要特别使用它,因为优化器将自行确定最佳计划,您不必担心关于它执行的连接类型。