SQL优化案例-使用with as优化Subquery Unnesting(七)
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,使用 no_unnest hint可以让执行计划产生filter,即不展开,但一般情况下使用unnest hint无法消除filter。如下SQL,找出库中非唯一索引,那么大家可能会这么写SQL:SE
千家信息网最后更新 2025年02月02日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安全错误
数据库的锁怎样保障安全
服务器打开iis管理
甘肃联想服务器虚拟化建设
高效办理的软件开发培训
公司网络安全自查项
蜂窝网络技术包括
下列关于软件开发的描述正确的是
db2 服务器 查看执行记录
计网网络安全知识点总结
驻马店馅沤网络技术有限公司
长宁区网络技术咨询哪家好
网络技术公司财务分析师
数据在云服务器中安全
ktv网络技术员
惠普服务器打不开
300mb数据库
计算机网络技术 毕业去向
甘南拉卜楞网城互联网科技
高硬防服务器租用
统一软件开发过程模型例子
宁海手机游戏软件开发找哪家
乌鲁木齐软件开发费用
公司网络安全自查项
数据库授权失败怎么解决
数据库6001错误
如何开发家庭服务器
sql查看数据库文件位置
我需要网络安全宣传手抄报
bs架构 软件开发
软件开发 运行维保费用
成都个人网络安全管理平台