SQL优化案例-使用with as优化Subquery Unnesting(七)
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,使用 no_unnest hint可以让执行计划产生filter,即不展开,但一般情况下使用unnest hint无法消除filter。如下SQL,找出库中非唯一索引,那么大家可能会这么写SQL:SE
千家信息网最后更新 2025年11月07日SQL优化案例-使用with as优化Subquery Unnesting(七)
使用 no_unnest hint可以让执行计划产生filter,即不展开,但一般情况下使用unnest hint无法消除filter。
如下SQL,找出库中非唯一索引,那么大家可能会这么写SQL:
SELECT SEGMENT_NAME,SUM(BYTES/1024/1024) m FROM DBA_SEGMENTS WHERE SEGMENT_NAME NOT IN (select index_name from dba_indexes where UNIQUENESS ='NONUNIQUE') GROUP BY SEGMENT_NAME;
耗时一分钟,为什么这么慢呢?在SQL语句where子查询后有not in、not exists、in、exists时,CBO会尝试将子查询展开(unnest)消除filter,但是上面的例子CBO并没有做到,下面我们看下执行计划。
我们再看下在子查询中加unnest hint的执行计划:
SELECT SEGMENT_NAME,SUM(BYTES/1024/1024) m FROM DBA_SEGMENTS WHERESEGMENT_NAME NOT IN (select /*+UNNEST */index_name from dba_indexeswhere UNIQUENESS ='NONUNIQUE') GROUP BY SEGMENT_NAME;
filter消除,CBO将基于数据字典底层的基表重新组合,使执行计划变成hash joinanti,0.23秒便执行完成了。
下面我们再来看下通过with as materialize优化subquery unnesting的例子。
SQL如下:
select AREA_NAME,sum(reve)from t_order o where exists (select AREA_ID from t_customer c where nation = 'Aus' and c.AREA_ID = o.AREA_ID union select AREA_ID from f_customer f where nation = 'US' and f.AREA_ID <> o.f_area_id) group by AREA_NAME;
selectsum(bytes/1024/1024) M from dba_segments where segment_name ='F_CUSTOMER'; M---------- 192
表F_CUSTOMER192M

执行计划如下:
我们看到并不走索引,要近2个小时执行完成,通过建立组合索引,让其走index_ffs
CREATE INDEX IDX_FFS_NATION_ID ONf_customer(AREA_ID,nation,0);

8分钟执行完成,那么还有没有更好的办法呢?
如下:
with x as ( select /*+ materialize */ AREA_ID from f_customer f where nation = 'US') select AREA_NAME,sum(reve)from t_order o where exists (select AREA_ID from t_customer c where nation = 'Aus' and c.AREA_ID = o.AREA_ID union select AREA_ID from x where x.AREA_ID <> o.f_area_id) group by AREA_NAME;
在FILTER中,NOT IN(NOT EXISTS)后的SQL语句多次执行,本来数据量就很大,每次都要执行一遍,结果可想而知。但是使用HINT MATERIALIZE和WITH AS 结合使用,把表中部分列实体化,执行过程中会创建基于视图的临时表。这样就不会每次NOT EXISTS都去执行一遍大数据表的扫描或者大的索引快速扫描,并且当表的数据越大,表越宽,这样的优化效果越明显。
| 作者简介
姚崇·沃趣科技高级数据库技术专家
熟悉Oracle、MySQL数据库内部机制,丰富的Oracle、MySQL故障诊断、性能调优、数据库备份恢复、复制、高可用方案及迁移经验。
数据
索引
数据库
查询
例子
语句
组合
很大
高级
可想而知
专家
会创
作者
办法
备份
字典
实体
小时
底层
性能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
厦门亿联网络技术股份有限公司
天成纸管网络技术支持
计算机网络技术及应用自考
楚天视讯网络技术参数
传奇3 服务器
应急部网络安全保障中心
数据库表怎么添加触发器
数据库运维实习生的面试技巧
怪物猎人 服务器 人数
江西非遗数据库公开接口
服务器安装两个docker
ce为什么改变不了数据库
佛都网络安全教育图片
我的世界op如何管理服务器
丰台区正规软件开发特点
mysql数据库好学么
申请服务器要备案吗
网络安全手抄句子
nba历史得分排名数据库
软件开发信息系统安全的意义
键盘记忆软件开发
网络安全检查报告
打印服务器无法打印机
软件开发文档会提供给甲方吗
黑龙江机电软件开发怎么样
湖南宏博网络技术有限公司
广州erp软件开发中心
网络安全法 促进 资源开放
奇迹mu 数据库分析
软件开发生鱼片模型