oracle union wher,sql – UNION with WHERE子句

在我的经验中,Oracle非常善于推动简单的谓词。以下测试在Oracle 11.2上进行。我相当确定它在所有版本的10g上也生成相同的执行计划。

(请人,如果你运行较早的版本,并尝试以下,请随意留下评论)

create table table1(a number, b number);

create table table2(a number, b number);

explain plan for

select *

from (select a,b from table1

union

select a,b from table2

)

where a > 1;

select *

from table(dbms_xplan.display(format=>'basic +predicate'));

PLAN_TABLE_OUTPUT

---------------------------------------

| Id | Operation | Name |

---------------------------------------

| 0 | SELECT STATEMENT | |

| 1 | VIEW | |

| 2 | SORT UNIQUE | |

| 3 | UNION-ALL | |

|* 4 | TABLE ACCESS FULL| TABLE1 |

|* 5 | TABLE ACCESS FULL| TABLE2 |

---------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

4 - filter("A">1)

5 - filter("A">1)

正如你可以在步骤(4,5)看到的,谓词在排序(联合)之前被下推并应用。

我无法让优化器推下整个子查询,如

where a = (select max(a) from empty_table)

或连接。有了合适的PK / FK约束,它可能是可能的,但显然有限制:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值