标量子查询优化--求解

sword1028 2016-05-05 02:10:13
各位大神,我有一个SQL想求优化方案,请大神们多多指导。


SQL :
SELECT (SELECT E.AMOUNT FROM D,E,F WHERE D.ID=E.DID AND E.ID=F.EID and E.EID IN (1,2,3) ) C1,
(SELECT E.AMOUNT FROM D,E,F WHERE D.ID=E.DID AND E.ID=F.EID and E.EID IN (4,5,6) ) C2,
(SELECT E.AMOUNT FROM D,E,F WHERE D.ID=E.DID AND E.ID=F.EID and E.EID IN (7,8,9) ) C3,
A.AMOUNT*C1,B.NUM*C2,C*C3
FROM A
JOIN B ON A.ID=B.AID
JOIN C ON C.BID=B.ID
WHERE B IN (1,2,3) AND C IN (4,5,7)

大概是以上的SQL,因为原始SQL保密请大家见谅,

我的主要目的想把标量子查询给做个优化,我目前只能想到通过with来修改思路如下,看看各位大神还有什么修改方法。

with t as (select e.amount from D,E,F WHERE D.ID=E.DID AND E.ID=F.EID and E.EID IN (1,2,3,4,5,6,7,8,9))
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
永远都学不完 2016-05-10
  • 打赏
  • 举报
回复
引用 4 楼 phosphor 的回复:
我加了hint /*+materialize*/ 收集统计信息的时候发现 逻辑读比直接 with t as时候要高(其他统计信息相同),但是查询速度比单纯with t as时候要快10%左右,谁能帮忙讲解一下啊
加了这个,就从内联视图变成了物化视图了,应该是把这个物化视图的数据放在了缓存当中,生成了一个临时表。感觉跟CREATE TABLE XX AS……建临时表一样的,但这个是把数据放在硬盘上,用完要手动删。前面那个放在内存当中,用完自动删除。 另外,那个条件,是否可以写成这样:E.EID<=9
sword1028 2016-05-06
  • 打赏
  • 举报
回复
还有个疑问,我在网上看到说如果with 表被执行2次以上系统会自动加入临时表中不用加/*+materialize*/ ,只有执行一次时候才需要加入/*+materialize*/ ,我现在的SQL是不是不用加/*+materialize*/ ????
sword1028 2016-05-06
  • 打赏
  • 举报
回复
我加了hint /*+materialize*/ 收集统计信息的时候发现 逻辑读比直接 with t as时候要高(其他统计信息相同),但是查询速度比单纯with t as时候要快10%左右,谁能帮忙讲解一下啊
kingkingzhu 2016-05-05
  • 打赏
  • 举报
回复
把你的with语句做物化视图
卖水果的net 2016-05-05
  • 打赏
  • 举报
回复
你自己的方法就挺好,一个表的三次扫描,变成了一次扫描,理论上讲,效率会提升不少;
ORAClE SE 2016-05-05
  • 打赏
  • 举报
回复
函数封装是最好的

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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