oracle 数据执行计划,Oracle里常见的执行计划

本文介绍了Oracle数据库里常见的执行计划,使用的Oracle数据库版本为11.2.0.1。

1、与表访问相关的执行计划

Oracle数据库里与表访问有关的两种方法:全表扫描和ROWID扫描。反映在执行计划上,与全表扫描对应的执行计划中的关键字是“TABLE ACCESS FULL”,与ROWID扫描对应的执行计划中关键字是“TABLE ACCESS BY USER ROWID”或“TABLE ACCESS BY INDEX ROWID”。

50b1a9951f8c9e2592f82b64ba5dc363.png

9ff86e2975a4fd445cdcb7fec0dfca84.png

c659af7a10f2fa08e5185ab399009410.png

从实验中可以看出,第一个SQL执行计划走的是对表EMP的全表扫描,对应的关键字就是“TABLE ACCESS FULL”;第二个SQL的执行计划走的是对表EMP的ROWID扫描,对应的关键字是“TABLE ACCESS BY USER ROWID”;第三个SQL的执行计划走的是对表EMP的ROWID扫描,对应的关键字是“TABLE ACCESS BY INDEX ROWID”。注意如果ROWID来源于用户手工指定则对应的是“TABLE ACCESS BY USER ROWID”;如果ROWID是来源于索引,则对应的是“TABLE ACCESS BY INDEX ROWID”。

2与B*Tree索引相关的执行计划

Oracle数据库里常见的与B*Tree索引访问相关的方法,包括索引唯一扫描、索引范围扫描、索引全扫描、索引快速全扫描和索引跳跃式扫描,反映在执行计划上分别对应INDEX UNIQUE SCAN、INDEX RANGE SCAN、INDEX FULL SCAN、INDEX FAST FULL SCAN和INDEX SKIP SCAN。

用实验查看相关执行计划

014fac439e02bf384755550a3d112719.png

第一个SQL的执行计划走的是对索引IDX_UNI_EMP的索引唯一扫描,关键字是“INDEX UNIQUE SCAN”。

d40af92b44d21b8c19d1903b5c039443.png

现在SQL的执行计划是对索引IDX_EMP_1的索引范围扫描,关键字是“INDEX RANGE SCAN”。

明明可以扫描索引IDX_EMP_1得到结果,却选择了全表扫描,就算使用Hint强制让Oracle扫描索引IDX_EMP_1,结果却是Hint失效了。

出现这个现象的原因是Oracle无论如何总会保证目标SQL结果的正确性,可能会得到错误结果的执行路径Oracle是不会考虑的。对于索引IDX_EMP_1而言,它是一个单键值的B*Tree索引,所以NULL值不会存储在其中,那么一量EMPLOYEE_ID出现了NULL值(虽然这里实际上并没有NULL值),则扫描索引的结果就是漏掉那些EMPLOYEE_ID为NULL值的记录,这也就意味着如果Oracle在执行上述SQL时选择了扫描IDX_EMP_1,那么执行结果就有可能是不准的。在这种情况下,Oracle当然不会考虑扫描索引,即使我们使用了Hint。

如果想让Oracle在执行上述SQL时扫描索引IDX_EMP_1,则必须将列EMPLOYEE_ID的属性修改为NOT NULL。这就相当于告诉Oracle,这里列EMPLOYEE_ID上不会有NULL值,你就放心地扫描索引IDX_EMP_1吧。

从上面的输出可以看出,现在SQL的执行计划走的是对索引IDX_EMP_1的索引快速全扫描,对应的是“INDEX FAST FULL SCAN”。

现在加上强制走索引IDX_EMP_1的Hint,再次执行该SQL

可以看到现在SQL的执行计划走的是对索引IDX_EMP_1的索引快速全扫描INDEX FULL SCAN(如果是在11.2.0.4版本上执行上以SQL可以以看到还是INDEX FAST FULL SCAN)

e3b04f7c14f70c18d3340340ddbed6b6.png

从上面输出可以看出,SQL的执行计划走的是对索引IDX_EMP_2的索引跳跃式扫描,对应“INDEXSKIP SCAN”。

3、与表连接相关的执行计划

Oracle数据库里常见的与表连接相关的一些方法:排序合并连接、嵌套循环连接、哈希连接等以及反连接和半连接

bfb33497c1695b161f287da5a54d0b7f.png

从上面的输出可以看出,SQL的执行计划走的是对表T1和T2的哈希连接,连接条件是t1.col2=t2.col2,对应的关键字是“HASH JOIN”。

使用强制走排序合并连接的Hint后再次执行SQL

a8bf28c72e080d94e0c04349a94b91fb.png

从上面的输出可以看出现在SQL的执行计划走的是对表T1和T2的排序合并连接,对应的关键字是“MERGEJOIN”和“SORT JOIN”。

接着使用强制走嵌套循环连接的Hint后再次执行SQL

fead269bc1fe02f20aba3aaa6be2c2c1.png

从上面的输出可以看出现在SQL的执行计划走的是对表T1和T2的嵌套循环连接,对应的关键字是“NESTEDLOOPS”

嵌套循环连接的驱动表是可以变的,我们使用Hint将上述SQL的驱动表改为T1再将执行SQL

c6ab919e442a4c9f8f6ec6c1a52839fe.png

从结果中可以看到,嵌套循环连接的驱动表确实已经变为T1

再看反连接的例子。首先将表T1和T2的连接列col2改为NOT NULL,以便能走出我们想要的反连接的执行计划

a0fb8db1f1805c4412b50154fd678e00.png

从输出内容上可以看出,SQL的执行计划走的是对表T1和T2的哈希反连接,反连接在执行计划中对应的关键字是“ANTI”,哈希反连接对应的就是“HASH JOIN ANTI”。

反连接的具体连接方法是可变的,这里使用Hint将SQL的反连接改为排序合并反连接

6432209729a16f0a52c91e53defec152.png

从输出内容可以看出,SQL的执行计划走的是对表T1和T2的排序合并反连接,对应的关键字是“MERGE JOIN ANTI”。

再使用Hint将SQL的反连接方法改为嵌套循环反连接

eaecc3f1a5d71334b473973170f12b72.png

再看半连接的例子。

0e012b270d626187af8f4bc8be1b2c74.png

从输出可以看出,SQL的执行计划走的是对表T1和T2的哈希半连接,半连接在执行计划中对应的关键字是“SEMI”,哈希半连接在执行计划中对应的关键字是“HASH JOIN SEMI”。

半连接的具体连接方法是可变的,使用Hint将SQL的半连接方法改为排序合并半连接:

78ca9bfed9a8d42ccddd1a6ab09e580b.png

从输出内容可以看出,SQL的执行计划走的是对表T1和T2的排序合并半连接,对应的关键字是“MERGE JOIN SEMI”。

再使用Hint把SQL的半连接方法改为嵌套循环半连接:

33bf8627fd71679098e0f3ff2880d5f2.png

从输出内容可以看出,SQL的执行计划走的是对表T1和T2的嵌套循环半连接,对应的关键字是“NESTED LOOPS SEMI”

4、关于位图索引相关的执行计划

Oracle数据库里常见的与位图索引访问相关的方法包括如下这些类型:位图索引单键值扫描、位图索引范围扫描、位图索引全扫描、位图索引快速全扫描、位图按位与、位图按位或、位图按位减等。

Oracle在使用完位图索引后通常会将最后的位图运算结果转化为ROWID,这一步转换过程对应的执行计划中的“BITMAP CONVERSION TO ROWIDS”。

21c97309155667ab023972ea1d34e21f.png从上面的输出内容可以看出,SQL的执行计划走的是对位图索引IDX_B_REGION的位图索引单键值扫描,对就的关键字是“BITMAP INDEX SINGLE VALUE”。

把SQL改写为范围查询后再次执行

82ca1134102d717ea43b473f478be928.png从输出内容可以看出SQL走的执行计划是对位图索引IDX_B_REGION的位图索引范围扫描,对应的关键字是“BITMAP INDEX RANGE SCAN”。

去掉where条件,并且只查询位图索引IDX_B_REGION的索引键值列:

4b3b96e4ecd739d9dddc0c31ffc465f0.png从输出可以看出SQL走的执行计划是对位图索引IDX_B_REGION的位图索引快速全扫描,对应的关键字是“BIT INDEX FAST FULL SCAN”。

执行如下SQL:

267f41357155f710cb9d126dcbb6c7b6.png

从输出内容可以看出SQL走的执行计划中,用到了位图按位与操作,对应的关键字是“BITMAP AND”和位图按位或操作,对应的关键字是“BITMAP OR”。

再构造位图按位减的执行计划,SQL如下:

24208122b10b3a3aeeef092f81967174.png从输出的执行计划中,位图按位减的执行计划对应的关键字是“BITMAP MINUX”。

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET MAUI实战 Dispatcher

详细内容这一期分享的内容非常简单,在之前使用过WPF的开发者对MVVM开发模式下ViewModel中后台线程转UI线程并不陌生使用Appplication.Current.Dispatcher。那么在.NET MAUI中也有同样的机制,存在于.NET MAUI Shell对象中。那么什么是Shell?官…

GDB 配置

GDB 配置 使用 GDB 扩展来配置 GDB 事实上我还是觉得原生的 GDB 就挺好,速度快,需要查看什么执行命令就可以。 GDB DashBoard https://github.com/cyrus-and/gdb-dashboard $sudo mkdir -m 777 ~/gdbinit; cd ~/gdbinit $git clone https://github.com/c…

Oracle区分中文和英文,oracle中中英文段落划分实现

oracle中关于中文占用字节数,不同的数据库有不同的情况,有的占用两个字节、有的占用三个字节,现在测试环境的数据库中文占用三个字节,要实现由中英文组成的段落字符串,按照每行占用多少字节重新分段,具体应…

未来哪些行业值得加入?

阅读本文大概需要5分钟。这个问题很多读者都问过,基本上每隔几篇原创就会有人留言问,还有公众号后台和知乎私聊。之前在一次留言中我承诺专门开一篇文章来聊聊这个话题,今天想着要兑现这个诺言了。为啥最近会存在这个问题呢,原因其…

虚拟机网络配置详解(NAT、桥接、Hostonly)

VirtualBox中有四种网络连接方式: NATBridged AdapterInternalHost-only AdapterVMWare中有三种,其实它跟VMWare的网络连接方式都是一样的概念,只是比VMWare多了Internal方式 在介绍四种工作模式之前,先说下虚拟网卡,虚拟机安装好…

Oracle收款核销了怎么撤销,21应收收款-核销取消或核销调整

注:本课程不包含学习下载资料目标人群:1、Oracle ERP/EBS初级顾问和技术顾问; 1、Oracle ERP/EBS用户熟练学习ERP系统的基本设置功能; 2、Oracle ERP/EBS财务初级顾问的学习; 3、其他对Oracle ERP/EBS有兴趣的想转行如…

微软宣布正式开源 Azure IoT Edge 边缘计算服务

开发四年只会写业务代码,分布式高并发都不会还做程序员? 微软宣布,去年年底公开预览的 Azure IoT Edge 边缘计算服务已进入官方版,并通过 GitHub 将其开源。Azure IoT Edge 主要将基于云的分析和定制的业务逻辑转移到边缘设备&a…

Windows下安装BeautifulSoup

电脑首先要安装好了python,我安装的是2.7。 下面就是bs4的安装过程了: 1.去官网下载BeautifulSoup4 2017.02.10目前最新版本:Beautiful Soup 4.3.2 2.解压文件 将下载得到的压缩包解压到任意文件夹,路径不含中文 3.打开cmd命令提示符 winr&am…

BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场

S<50只股票D<10天的价格给出&#xff0c;求第一天开始用n<200000元最后能得到的最大钱数&#xff0c;保证答案<500000。 做D次完全背包即可&#xff0c;每次做完把dp数组清空。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #i…

OC如何跳到系统设置里的各种设置界面

当 iOS系统版本 < iOS7时 , 只能跳转到 系统设置页面 &#xff0c;楼主试了下&#xff0c;非真机是没有任何效果的 当iOS系统版本 < iOS 10.0 时 NSURL *url [NSURL URLWithString:"prefs:rootLOCATION_SERVICES"]; if( [[UIApplication sharedApplication]can…

oracle 注册程序,oracle 静态注册

1. 最近在装ASMDATAGUARD&#xff0c; 在静态注册上面吃了大亏&#xff0c;现总结如下2. 在Asm环境中&#xff0c;listener监听器在grid用户下DGLSN (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST asm)(PORT 1521))))SID_LIST_DGLSN (SID_LIST (SID_DESC (…

Linux下find用法总结

find:实时查找工具&#xff0c;通过遍历指定起始路径下的文件系统层级结构完成文件查找:工作特性:查找速度略慢精确查找实时查找用法:find [option] [查找起始路径][查找条件][处理动作]查找起始路径&#xff1a;指定具体搜索目标起始路径&#xff1b;默认为当前目录查找条件:指…

虚拟DOM Diff算法解析

React中最神奇的部分莫过于虚拟DOM&#xff0c;以及其高效的Diff算法。这让我们可以无需担心性能问题而”毫无顾忌”的随时“刷新”整个页面&#xff0c;由虚拟DOM来确保只对界面上真正变化的部分进行实际的DOM操作。React在这一部分已经做到足够透明&#xff0c;在实际开发中我…

生成ID模板:年月日时分秒+6位自增码

因为生成订单ID、商品ID 或者什么什么ID的&#xff0c;不想用自增&#xff0c;又怕反复&#xff0c;于是就用 年与日时分秒 6位自增码 &#xff08;共计20位长度&#xff09;来当作ID 注意&#xff1a;假设你的ID是Long型。就要注意&#xff0c;Long的最大长度为19位&#xf…

oracle optimizer_features_enable,Oracle Optimizer:迁移到使用基于成本的优化器—–系列2.1-数据库专栏,ORACLE...

oracle optimizer:迁移到使用基于成本的优化器—–系列2.1系列之二包含影响优化器选择执行计划的初始化参数和oracle内部隐藏参数&#xff0c;合理设置这些参数对于优化器是相当重要的。6.影响优化器的初始化参数除了生成统计资料之外&#xff0c;下面提及的参数设置在你的系统…

Azure 跨订阅迁移资源踩坑记

突然收到微软的邮件&#xff0c;提示我的一个 Azure 订阅已经到期&#xff0c;所以转为“禁用”状态&#xff0c;只能进行数据的导出和处理。在这个订阅里有不少较重要的资源在跑&#xff0c;直接关了可不行…于是开启了一个支持事件&#xff0c;台湾美眉的态度和声线真的没话说…

阶乘的精确性

/* 输入不超过1000的正整数n&#xff0c;输出n!1*2*3*……*n的精确结果。 样例输入&#xff1a;30 样例输出&#xff1a;265252859812191058636308480000000 例如 n3&#xff1b;s6&#xff1b; n4&#xff1b;s24&#xff1b; n5&#xff1b;s120&#xff1b; 1000的阶乘需要一…

Optaplanner规划引擎的工作原理及简单示例(1)

在之前的文章中&#xff0c;老猿已介绍过APS及规划的相关内容&#xff0c;也对Optaplanner相关的概念和一些使用示例进行过介绍&#xff0c;接下来的文章中&#xff0c;我会自己做一个规划小程序 - 一个关于把任务分配到不同的机台上进行作来的小程序&#xff0c;并在这个小程序…

[HNOI2017]礼物

题目描述 我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了&#xff0c;他决定买一对情侣手环&#xff0c;一个留给自己&#xff0c;一个送给她。每个手环上各有 n 个装饰物&#xff0c;并且每个装饰物都有一定的亮度。 但是在她生日的前一天&#xff0c;我的室友突…

《ASP.NET Core 6框架揭秘》实例演示[25]:配置与承载环境的应用

与服务注册一样&#xff0c;针对配置的设置同样可以采用三种不同的编程模式。第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象&#xff0c;它可以帮助我们设置面向宿主和应用的配置。IWebHostBuilder接口上面同样提供了一系列用来对配置进行设置的方法&…