with as 与临时表的区别_Oracle实验--从一个需求实现来看为什么要用with改写sql?

概述

前面已经介绍了with的一些用法,今天主要通过一个实验来简单测试下用不用with的一些不同。


1、环境准备

准备测试数据267万

CREATE TABLE t AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;insert into t select * from t;//.....
a9f66d78892cc50a4c117d141db7c26e.png

2、需求

需求:列出T表中用户包含对象数量大于平均用户对象数的记录。

这里大家可以想一下你们一般会怎么去实现?


3、方案1

set timing on;SELECT OWNER, COUNT(*) CN FROM T GROUP BY OWNER HAVING COUNT(*)>(SELECT AVG(COUNT(*)) FROM T GROUP BY OWNER);
867b78ed7c58f8b8f96bf21bfaaf06a9.png

查看执行计划:

14c5dee034ac7df0b75ae6d51054909d.png

4、方案2

当查询中多次用到某一部分时,可以用Oracle with语句创建一个公共临时表。因为子查询在内存临时表中,避免了重复解析,所以执行效率会提高不少。临时表在一次查询结束自动清除。

set timing on;WITH A AS(SELECT OWNER, COUNT(*) CN FROM T GROUP BY OWNER) SELECT A.* FROM A, (SELECT AVG(CN) ACN FROM A) B WHERE A.CN > B.ACN;
bf6f3a58921dcacefc7b7c691c2ab47d.png

查看执行计划

可以看到先对T表做个全表扫描,然后产生一个公共临时表,后面就只用这个临时表做关联查询,避免了重复解析。

d50f92471f658ff32bcfb3fdd7ccd6f9.png

总结

总之对于同个表如果要避免重复读取这种情况可以考虑用with方式来改写。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

a47735da0ef60a1ba881855a48e965a3.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值