繁体   English   中英

Oracle 11与视图连接成本很高

[英]Oracle 11 joining with view has high cost

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

一切都通过屋顶瓦解。

我认为正在发生的事情是谓词没有被推向视野。 这样,视图现在将进行全表扫描,并将所有内容连接到所有内容,然后最终删除所有行。 每个提示,调整或我所做的任何事情似乎都无济于事。

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

在此处输入图片说明

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

在此处输入图片说明

抱歉,如果这是含糊的,则将不胜感激。

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

另外,您在case语句中具有group by函数,这也可能使优化程序更糟

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

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

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

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

最终结果是,我现在可以将该视图与另一个表连接起来,并且开销是合理的,并且该计划显示谓词已被推送。 在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM