请教一个视图的性能问题

accipiter2000 2018-01-22 04:49:46
表A,B,M,N数据都很多,B是A的子表,M,N是B的子表

A:B=1:N
B:M=1:N
B:N=1:N

现在创建了一个视图
create or replace view V_Z as
with V as (select B.B_ID_, A.A_ID_ ... from B inner join A on B.A_ID_ = A.A_ID_)
select B.B_ID_, A.A_ID_, ... from M inner join V on M.B_ID_ = V.B_ID_
union all
select B.B_ID_, A.A_ID_, ... from N inner join V on N.B_ID_ = V.B_ID_
视图中先创建了一个B表的临时视图,然后关联M,N进行查询

然后在此视图上继续查询
select * from V_Z where A_ID_ = '***'
现在的问题是速度比较慢。

如果能把 A_ID_ = '***'这个条件放到视图里面,
with V as (select B.B_ID_, A.A_ID_ ... from B inner join A on B.A_ID_ = A.A_ID_ and A_ID_ = '***')
速度就会快很多。其实就是先过滤后查询,和先查询,后过滤的问题。当然是先过滤快。但现在这个动态的过滤如何能放进视图中?
我看过网上的一些方法,特别是用oracle函数传参的那种,感觉不是很好,肯定会有并发的问题。是否有较好的sql写法,能让oracle自动进行优化?
...全文
486 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2018-01-23
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
使用了 union all ,将不会有 谓词推进。
反了,我的哥~
卖水果的net 2018-01-22
  • 打赏
  • 举报
回复
使用了 union all ,将不会有 谓词推进。
accipiter2000 2018-01-22
  • 打赏
  • 举报
回复
引用 3 楼 minsic78 的回复:
三连下。 如果这个视图还可能被用来做主题贴中提到A_ID_ = '***'之外的其他查询,那么还可能会有各种性能问题,也许做这么一个视图的意义不大……
有道理,那我现在考虑直接在视图中先过滤了。 用的技术是先设置数据库的context,然后视图l从context中拿参数。 现在的问题是,数据库设置context这个东西是否支持事务?能被事务管理吗?如果不能,一定会有事务的问题。
liu志坚 2018-01-22
  • 打赏
  • 举报
回复
看看sql的执行计划,要走索引,别全表扫描。
minsic78 2018-01-22
  • 打赏
  • 举报
回复
引用 1 楼 minsic78 的回复:
你把视图中的with子查询去掉再试试
去掉的意思不是说不和这个临时表做join,而是用这个完整的查询取代union all中的两个V
minsic78 2018-01-22
  • 打赏
  • 举报
回复
你把视图中的with子查询去掉再试试
minsic78 2018-01-22
  • 打赏
  • 举报
回复
三连下。 如果这个视图还可能被用来做主题贴中提到A_ID_ = '***'之外的其他查询,那么还可能会有各种性能问题,也许做这么一个视图的意义不大……

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧