ORACLE连接多表性能
ORACLE join multiple tables performance
我的问题有点复杂。
假设我有 7 tables(每行 2000 万+行)(Table1,Table2 ...)和相应的 pk(pk1,pk2,....)(所有 tables 之间的基数是 1:1)
我想得到我的最终 table (使用散列连接)作为:
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
我想知道像这样先创建部分 table 然后再创建最终 table 是否会更快?
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 select.
中使用所有 7 个连接
谢谢,我希望我的问题很容易理解。
一般来说,创建临时表不是更好。 SQL 引擎有一个优化阶段,这个优化阶段应该能很好地找出最佳查询计划。
在一堆连接的情况下,这主要是关于连接顺序、索引的使用和最佳算法。
这是一种很好的默认态度。这是否意味着临时表对性能优化永远没有用?一点也不。以下是一些例外情况:
- 优化器生成了次优查询计划。在这种情况下,查询提示可以将优化器推向正确的方向。而且,临时表可以提供帮助。
- 正在为临时表编制索引。有时临时表上的索引可以大大提高性能。优化器可能不会选择它。
- Re-use 个跨查询的临时表。
对于您使用散列连接的特定目标,您可以使用查询提示来确保优化器执行您希望的操作。我应该注意,如果连接是在主键上,那么散列连接可能不是最佳算法。
在数据库中创建临时表不是一个好主意。为报告目的或更快的结果优化您的查询尝试使用视图,它可以带来更好的结果。
对于你的具体情况,你想使用散列连接,你能解释一下你为什么要使用它,特别是因为优化器会自行确定最佳计划,你不必担心关于它执行的连接类型。
我的问题有点复杂。 假设我有 7 tables(每行 2000 万+行)(Table1,Table2 ...)和相应的 pk(pk1,pk2,....)(所有 tables 之间的基数是 1:1) 我想得到我的最终 table (使用散列连接)作为:
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
我想知道像这样先创建部分 table 然后再创建最终 table 是否会更快?
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 select.
中使用所有 7 个连接
谢谢,我希望我的问题很容易理解。
一般来说,创建临时表不是更好。 SQL 引擎有一个优化阶段,这个优化阶段应该能很好地找出最佳查询计划。
在一堆连接的情况下,这主要是关于连接顺序、索引的使用和最佳算法。
这是一种很好的默认态度。这是否意味着临时表对性能优化永远没有用?一点也不。以下是一些例外情况:
- 优化器生成了次优查询计划。在这种情况下,查询提示可以将优化器推向正确的方向。而且,临时表可以提供帮助。
- 正在为临时表编制索引。有时临时表上的索引可以大大提高性能。优化器可能不会选择它。
- Re-use 个跨查询的临时表。
对于您使用散列连接的特定目标,您可以使用查询提示来确保优化器执行您希望的操作。我应该注意,如果连接是在主键上,那么散列连接可能不是最佳算法。
在数据库中创建临时表不是一个好主意。为报告目的或更快的结果优化您的查询尝试使用视图,它可以带来更好的结果。
对于你的具体情况,你想使用散列连接,你能解释一下你为什么要使用它,特别是因为优化器会自行确定最佳计划,你不必担心关于它执行的连接类型。