Oracle 11加入视图的成本很高

时间:2017-10-03 15:12:15

标签: oracle join view predicates

我在将视图加入另一个表时遇到了一些困难。这是在运行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 ..." 
一切都因为屋顶成本而分崩离析。

我认为正在发生的事情是谓词没有被推到视野中。因此,视图现在正在执行全表扫描并将所有内容连接到所有内容,然后最终删除所有行。 每一个提示,调整或任何我做过的事情似乎都没有帮助。

在查看计划时,看起来它有谓词。

enter image description here

但是一切都加入后就会发生这种情况。

enter image description here

对不起,如果这是神秘的,但任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

由于您的视图带有" GROUP BY",谓词无法推送到内部查询

此外,你在case语句中有函数组,这也可能使优化器更糟糕

Oracle为每个版本/发行版/补丁引入了Optimizer的增强功能。很难说您正在运行的版本支持哪些内容。但是,您可以尝试:

  1. 看看是否从GROUP BY功能中删除案例会有所不同
  2. 否则,您必须将视图中的GROUP BY和GROUP BY函数带到最外层查询

答案 1 :(得分:0)

在我额头上的许多键盘压痕之后,我可能会欺骗Oracle推动谓词。我不确切知道为什么会这样,但简化事情可能会有所帮助。

我将所有ON子句更改为USING子句,这样列名称现在与我加入的列匹配。在其他一些常量谓词中,我在视图的where子句中添加了它。

最终结果是我现在可以将此视图与另一个表一起加入,并且成本合理,并且计划显示正在推送谓词。 enter image description here

感谢所有关注此问题的人。