Oracle调优之no_unnest和unnest用法简介

本博客介绍Oracle SQL调优的一种常用也是很实用的方法,也即/*+no_unnest *//*+ unnest*/,介绍Oracle 的 /*+unnest *//*+ no_unnest */之前,先介绍一下Hint。

Hint对于开发人员来说,可能不是很熟悉,但是对于DBA来说,Hint可是一种调优的利器,Hint 是Oracle 提供的一种SQL语法,是oracle早期因为oracle优化器还不是很完善加上去的,可以辅助oracle优化器,常用于SQL调优,通过Hint强行改变Oracle的执行计划,从而实现SQL调优

也就是说Hint语法可以人工地干预Oracle优化器选择执行计划,当然Hint虽然很实用,但是用的不好,也必然影响SQL性能,国内DBA大牛在其博文里就有曾提到,引用其博文的观点:



详情可以参考作者博文:https://dbaplus.cn/news-10-669-1.html

ok,有了前面的必要知识后,可以介绍一下Oracle的Hint语法之no_unnest和unnest用法了,no_unnest、unnest显然是一对相对的用法

  • unnest:也即解嵌套,nest是嵌套的意思,也就是让子查询展开查询,和外部的查询进行关联、合并,从而得到执行计划
  • no_unnest:双重否定表肯定,也是子查询嵌套(nest),让子查询不展开,这时候子查询往往是最后执行的,作为FILTER条件来过滤外部查询

对于hint语法来说,形式就是/*+ .... */的形式,所以对于这两种嵌套和解嵌套查询,其用法分别为/*+ no_unnest *//*+ unnest*/,加在子查询的select关键字后面即可,我之前博客曾经整理过Hint的常用语法,详情参考我博客Oracle之Hint用法整理笔录

案例记录,ok,最近遇到一个sql查询需要超过1分钟的情况,因为是生产环境问题,比较紧急,业务又特别复杂,SQL很复杂,关联了十几张表(业务需要),如果通过改写sql来调优,比较花时间,业务不够熟悉的情况,所以,首先我也是先通过加必要索引的方式,检查主键、外键是否都有索引了,索引也不能乱叫,还要分析哪些表更新比较多的,然后我是想到hint调优,虽然hint有局限性是在某些sql不改写的情况是可以起到作用的,如果sql改变,hint语法很有可能影响SQL性能,所以使用hint调优并非上策

我遇到的sql是很复杂的,不过本文进行简单描述,其SQL语法类似如下,省略很多的情况:

select id,....,from t1 left join t2 where t2.id in (select k from t1 where ...) ....

首先,我想到用子查询解嵌套方式,进行改写:

select id,....,from t1 left join t2 where t2.id in (select /*+ unnest */ k from t1 where ...) ....

然后通过执行计划查询,性能并没有提升,unnest是让子查询展开,和外部的查询进行关联、合并,首先t1是一张数据量很多的表,然后SQL里先left join了t1,又在子查询里使用了t1,如果unnest的话,不是会进行自连接?所以我改成/*+ no_unnest */,不让子查询展开,让子查询最后执行,作为一个filter条件,经过实验,sql查询从1分钟以上都0点及秒

ok,说明一下,本人水平并没有dba水平,对于SQL调优没有丰富经验,所以请作者可以不管我的案例,只要理解unnest和no_unnest的用法即可,sql调优是很复杂,需要很多调优经验才可以做到游刃有余的,本博客观点,仅代表本人观点,因为对sql调优本没有深入理解,所以也并没有特别推崇使用unnest或者no_unnest,这两种用法具体在什么环境使用适宜?在网上也没有找到特别明确的说明,所以遇到sql性能问题,通过分析执行计划是最有用的

附录:

  • SQL优化:一篇文章说清楚Oracle Hint的正确用法:https://dbaplus.cn/news-10-669-1.html
  • 性能优化之查询转换 子查询类:https://chuansongme.com/n/1394222147942
  • 解决CBO的SQL优化问题(图文详解):https://www.php.cn/mysql-tutorials-360101.html
  • Oracle里的查询转换:https://www.linuxidc.com/Linux/2019-03/157808.html

Oracle SQL调优系列之no_unnest和unnest用法简介相关推荐

  1. oracle sql 执行计划分析_Oracle SQL调优系列之看懂执行计划explain

    1.文章写作前言简介 SQL调优系列博客链接:SQL调优专栏 之前曾经拜读过<收获,不止sql调优>一书,此书是国内DBA写的一本很不错的调优类型的书,是一些很不错的调优经验的分享.虽然读 ...

  2. oracle trim 性能,ORACLE sql调优之记录一次trim函数引发的大表全表扫描

    2017年8月14日,一地市oracle相关的调度程序ETL抽取速度奇慢,sql语句每次执行平均时间要9秒左右,如果所示: 该调度过程涉及的sql语句如下: select count(*) from ...

  3. Oracle SQL 调优健康检查脚本

    /* 在CBO时代,一个SQL的执行计划是多样的.影响执行计划的因素也从过去RBO时代的SQL书写规则变为综合性因素.这为我们生成更加优秀执行计划提供了基础,同时也给我们进行调优带来的很多麻烦. 目前 ...

  4. ORACLE SQL调优之执行计划与隐藏参数_complex_view_merging

    最近,赤峰windows 版的11.2.0.3的oracle数据库出现一条sql语句执行非常慢,需要1天的时间还出不来,但是观察服务器的IO和CPU都是很空闲,并且将 该sql语句涉及的对象全部导出, ...

  5. ORACLE SQL调优案例一则

    收到监控告警日志文件(Alert)的作业发出的告警邮件,表空间TEMPSCM2不能扩展临时段,说明临时表空间已经被用完了,TEMPSCM2表空间不够用了 Dear All:     The Insta ...

  6. Oracle专家调优秘密

    在过去的十年中,Oracle已经成为世界上最专业的数据库之一.对于IT专家来说,就是要确保利用Oracle的强大特性来提高他们公司的生产力.最有效的方法之一是通过Oracle调优.它有大量的调整参数和 ...

  7. Oracle 性能调优 概述

    在过去的十年中, Oracle 已经成为世界上最专业的数据库之一.对于 IT 专家来说,就是要确保利用 Oracle 的强大特性来提高他们公司的生产力.最有效的方法之一是通过 Oracle 调优.它有 ...

  8. Oracle性能调优

    在过去的十年中,Oracle已经成为世界上最专业的数据库之一.对于IT专家来说,就是要确保利用Oracle的强大特性来提高他们公司的生产力.最有效的方法之一是通过Oracle调优.它有大量的调整参数和 ...

  9. SQL Server调优系列基础篇(联合运算符总结)

    前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...

最新文章

  1. Array 数组去重 总结10方法(7)
  2. 写sql语句的经验之谈
  3. 归并排序python实现
  4. 苹果要做第一个吃螃蟹的人!将率先尝试台积电5nm工艺
  5. python自动登录qq空间_python 利用splinter组件,自动登录QQ空间
  6. jenkins-邮件通知
  7. PAT乙级1025反转链表 25(分)
  8. android获取网络视频缩略图,Android 获取视频(本地和网络)缩略图的解决方案
  9. 【数字信号处理】基于matlab数字信号同步压缩变换【含Matlab源码 1534期】
  10. ZOJ 3256 Tour in the Castle(插头DP-按行递推—矩阵)
  11. 1.2 架构结构和视图
  12. 小程序和H5真的有孰优孰劣吗?详解两者的适用场景
  13. 自适应滤波器 | 时域ALE算法
  14. 左霆:无处不在的订阅经济
  15. 敏感词过滤的算法原理之 Aho-Corasick 算法
  16. 国家住宅装饰装修工程施工规范
  17. Dell戴尔G7 7588换m.2 nvme固态硬盘+系统迁移
  18. 联想MIIX 510-12ISK 改Win7系统
  19. Android PMS运行规则
  20. 2022年度总结,以及2023的全新展望

热门文章

  1. VOL指标-成交量指标
  2. OPTI 返回值 意思
  3. MyBatisPlus + Oracle 联合查询排序问题整理,2021 年最后一篇
  4. 远场距离除了10λ和2D^2/λ还有别的吗?
  5. 什么叫反光识别读数识别_反光识别和读数识别是什么意思 反光膜 反光镜 反光材料...
  6. 【C++】LeetCode 题库 1834. 单线程 CPU
  7. Keepass2Android病毒吗,带有OTP的Keepass2Android无法正常工作
  8. 基金认购与申购的区别是什么
  9. matlab软件的功能介绍
  10. 电商行业关联“你我他”,穿越牛熊带飞“你我他”