我在将视图加入另一个表时遇到了一些困难。这是在运行 11.2 的 Oracle RAC 系统上
我会尽量提供尽可能多的细节,而不涉及特定的表结构,因为我的公司不喜欢这样。
你们都知道这是如何工作的。“嘿,你能写一些非常丑陋的软件来实现我们疯狂的想法吗?”
他们想让我做的想法是创建一个视图,最终用户不知道他们是在跟踪新表还是旧表,因此其中一个表是返回“ON”的参数表或"OFF" 并在 case 语句中使用。
select子句中有一些不太难但嵌套的case语句
我有一个看法:
create view my_view as
select t1.a as a, t1.b as b, t1.c as c,
sum(case when t2.a = 'xx' then case when t3.a then ... ,
case when t2.a = 'xx' then case when t3.a then ... ,
from table1 t1
join table t2 on (t1.a = t2.a etc...)
full outer join t3 on (t1.a = t3.a etc...)
full outer join t4 on (t1.a = t4.a etc...)
group by t1.a, t1.b, t2.c, and all the ugly case statements...
现在,当我运行查询时
select * from my_view where a='xxx' and b='yyy' and c='zzz'
查询运行良好,成本为 10。
但是,当我将此视图与另一个表连接时,一切都崩溃了。
select * from my_table mt join my_view mv on (mt.a = mv.a and mt.b=mv.b and mt.c=mv.c) where ..."
一切都因屋顶而分崩离析。
我认为正在发生的是谓词没有被推送到视图中。因此,视图现在正在执行全表扫描并将所有内容连接到所有内容,然后最终删除所有行。我所做的每一个提示、调整或任何事情似乎都没有帮助。
在查看计划时,它看起来像是有谓词。
但这发生在一切都加入之后。
对不起,如果这很神秘,但任何帮助将不胜感激。