Oracle 如何强制推送谓词在视图中通过UNION ALL?

Oracle 如何强制推送谓词在视图中通过UNION ALL?,oracle,predicate,union-all,Oracle,Predicate,Union All,我在UNION ALL视图中遇到性能问题。这个问题可以通过在两个不同的视图中重写视图来解决,但是这样做会破坏创建视图的目的 下面是一个简单的测试用例(Oracle 11.2.0.3.0)。真正的查询使用大约10个不同的表,而不是3个 CREATE TABLE t0 (id number, ref_id number); CREATE INDEX i0 on t0(id); CREATE TABLE t1 (id number, amount number); CREATE INDEX i1 on

我在UNION ALL视图中遇到性能问题。这个问题可以通过在两个不同的视图中重写视图来解决,但是这样做会破坏创建视图的目的

下面是一个简单的测试用例(Oracle 11.2.0.3.0)。真正的查询使用大约10个不同的表,而不是3个

CREATE TABLE t0 (id number, ref_id number);
CREATE INDEX i0 on t0(id);
CREATE TABLE t1 (id number, amount number);
CREATE INDEX i1 on t1(id);
CREATE TABLE t2 (id number, amount number);
CREATE INDEX i2 on t2(id);


insert into t0 select rownum, rownum * 10 from dual connect by rownum <= 100000;
insert into t1 select rownum, rownum * 10 from dual connect by rownum <= 100000;
insert into t2 select rownum, rownum * 10 from dual connect by rownum <= 100000;



CREATE OR REPLACE VIEW v2
AS
SELECT id, sum(amount) AS total_amount
FROM t1
GROUP BY id;

CREATE OR REPLACE VIEW v3
AS
SELECT id
      ,sum(amount) as total_amount
FROM (SELECT id, amount
      FROM t1
      UNION ALL
      SELECT id, amount
      FROM t2)
GROUP BY id
HAVING sum(amount) <> 0
;

CREATE OR REPLACE view v1
AS
SELECT *
FROM v2
UNION ALL
SELECT *
FROM v3;
下一个查询在16 GET处触底,尽管它执行的操作与第一个查询相同,只扫描t0两次而不是一次

select --+ first_rows
*
from t0, v2
where  t0.ref_id = v2.id
  and t0.id = 1
union all
select *
from t0, v3
where  t0.ref_id = v3.id
  and t0.id = 1;
我错过了什么

可能当有组被Oracle推不出谓词时。
select --+ first_rows
*
from t0, v2
where  t0.ref_id = v2.id
  and t0.id = 1
union all
select *
from t0, v3
where  t0.ref_id = v3.id
  and t0.id = 1;