我在将视图加入另一个表时遇到了一些困难。这是在运行11.2
的Oracle RAC系统上我会尝试尽可能详细地提供详细信息,而不会进入特定的表结构,因为我的公司不喜欢这样。
你们都知道这是如何运作的。 "嘿,你能写一些非常难看的软件来实现我们疯狂的想法吗?"
他们希望我做的事情的想法是制作一个视图,最终用户不知道他们是在追求新表还是旧表,因此其中一个表是一个参数表,返回" ON"或" OFF"并用于案例陈述中。
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 ..."
一切都因为屋顶成本而分崩离析。
我认为正在发生的事情是谓词没有被推到视野中。因此,视图现在正在执行全表扫描并将所有内容连接到所有内容,然后最终删除所有行。 每一个提示,调整或任何我做过的事情似乎都没有帮助。
在查看计划时,看起来它有谓词。
但是一切都加入后就会发生这种情况。
对不起,如果这是神秘的,但任何帮助将不胜感激。
答案 0 :(得分:0)
由于您的视图带有" GROUP BY",谓词无法推送到内部查询
此外,你在case语句中有函数组,这也可能使优化器更糟糕
Oracle为每个版本/发行版/补丁引入了Optimizer的增强功能。很难说您正在运行的版本支持哪些内容。但是,您可以尝试:
答案 1 :(得分:0)