[英]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的每个版本/发行版/补丁引入了增强功能。 很难说您正在运行的版本支持什么。 但是,您可以尝试:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.