我正在做一个UNION
Oracle 数据库上的两个查询。他们俩都有一个WHERE
条款。如果我这样做的话,性能会有什么不同吗?WHERE
after UNION
与执行查询相比UNION
after WHERE
clause?
例如:
SELECT colA, colB FROM tableA WHERE colA > 1
UNION
SELECT colA, colB FROM tableB WHERE colA > 1
相比:
SELECT *
FROM (SELECT colA, colB FROM tableA
UNION
SELECT colA, colB FROM tableB)
WHERE colA > 1
我相信在第二种情况下,它会对影响性能的两个表执行全表扫描。那是对的吗?
根据我的经验,Oracle 非常擅长推动simple周围的谓词。以下测试是在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 约束,这可能是可能的,但显然存在局限性:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)