连接和联合的评估顺序和优化
Evaluation order and optimization for Joins and Unions
我需要执行动态形成的查询。
该查询将通过集合操作inner join(相当于AND)和union(相当于OR)得到一个结果集。
假设用户输入:A & B | C&D
其中
- A = 'select num from table_a'
- 乙='select num_b from table_b'
- C = 'select num_c from table_c'
- D = 'select num_d from table_d'
为了获得一个结果集,我将动态执行:
select * from A inner join B union C inner join D;
我知道优化器如何与联合一起工作,但我找不到关于它们如何一起评估的任何信息。
鉴于输入可以解释为:
- (A & B) | (C & D)
- A & (B | C) & D
- A & (B | (C & D))
- (A & B | C) & D
我的问题是:
优化器将如何执行这个集合操作?
括号在这种情况下是否相关?
感谢您的宝贵时间。
我想你的意思是:
select * from A inner join B union
select * from C inner join D;
这实际上是:
(select * from A inner join B) union
(select * from C inner join D);
编辑:
实际上,将您的逻辑表达为:
可能会更好
select * from A
intersect
select * from B
union
select * from C
intersect
select * from D;
...实际上是:
(((select * from A
intersect
select * from B)
union
select * from C)
intersect
select * from D);
http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries004.htm
如有任何疑问,请自行指定括号。
我需要执行动态形成的查询。
该查询将通过集合操作inner join(相当于AND)和union(相当于OR)得到一个结果集。
假设用户输入:A & B | C&D
其中
- A = 'select num from table_a'
- 乙='select num_b from table_b'
- C = 'select num_c from table_c'
- D = 'select num_d from table_d'
为了获得一个结果集,我将动态执行:
select * from A inner join B union C inner join D;
我知道优化器如何与联合一起工作,但我找不到关于它们如何一起评估的任何信息。
鉴于输入可以解释为:
- (A & B) | (C & D)
- A & (B | C) & D
- A & (B | (C & D))
- (A & B | C) & D
我的问题是:
优化器将如何执行这个集合操作?
括号在这种情况下是否相关?
感谢您的宝贵时间。
我想你的意思是:
select * from A inner join B union
select * from C inner join D;
这实际上是:
(select * from A inner join B) union
(select * from C inner join D);
编辑:
实际上,将您的逻辑表达为:
可能会更好select * from A
intersect
select * from B
union
select * from C
intersect
select * from D;
...实际上是:
(((select * from A
intersect
select * from B)
union
select * from C)
intersect
select * from D);
http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries004.htm
如有任何疑问,请自行指定括号。