gpt4 book ai didi

sql - UNION 与 WHERE 子句

转载 作者:行者123 更新时间:2023-12-03 06:53:42 27 4
gpt4 key购买 nike

我正在做一个UNION Oracle 数据库上的两个查询。他们俩都有一个 WHERE条款。如果我执行 WHERE ,性能是否有差异?之后UNION执行查询与执行 UNION 相比之后WHERE条款?

例如:

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 非常擅长插入简单谓词。以下测试是在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 约束,这可能是可能的,但显然存在局限性:)

关于sql - UNION 与 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5437507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com