1

我在将视图加入另一个表时遇到了一些困难。这是在运行 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 ..." 

一切都因屋顶而分崩离析。

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

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

在此处输入图像描述

但这发生在一切都加入之后。

在此处输入图像描述

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

4

2 回答 2

0

由于您的视图带有“GROUP BY”,因此无法将谓词推送到内部查询

此外,您在 case 语句中使用了 group by 函数,这也可能使优化器变得更糟

Oracle 在每个版本/发行版/补丁中都引入了优化器的增强功能。很难说您正在运行的版本支持什么。但是,您可以尝试:

  1. 看看从 GROUP BY 函数中删除大小写是否会有所不同
  2. 否则,您必须将 GROUP BY 和 GROUP BY 函数从视图带到最外层的查询
于 2017-10-03T16:14:20.667 回答
0

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

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

最终结果是我现在可以将此视图与另一个表连接起来,并且成本是合理的,并且计划显示谓词正在被推送。 在此处输入图像描述

感谢所有关注这个问题的人。

于 2017-10-03T19:54:59.300 回答