在我的经验中,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约束,它可能是可能的,但显然有限制:)