我有点复杂的问题。 假设我有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个连接会更好。
谢谢,我希望我的问题很容易理解。
答案 0 :(得分:1)
通常,创建临时表并不是更好。 SQL引擎有一个优化阶段,这个优化阶段应该很好地确定最佳查询计划。
在一堆连接的情况下,这主要是关于连接顺序,索引的使用和最优算法。
这是一个很好的默认态度。这是否意味着临时表永远不会对性能优化有用?一点也不。以下是一些例外情况:
对于使用散列连接的特定目标,您可以使用查询提示来确保优化程序执行您想要的操作。我应该注意,如果连接在主键上,那么散列连接可能不是最佳算法。
答案 1 :(得分:0)
在数据库中创建临时表不是一个好主意。为了报告目的而优化您的查询或使用视图尝试更快的结果,它可以带来更好的结果。
对于您的具体情况,您想要使用散列连接,请稍微解释一下,为什么您要特别使用它,因为优化器将自行确定最佳计划,您不必担心关于它执行的连接类型。