Oracle 执行计划

1.执行计划

执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。

执行计划描述了SQL引擎为执行SQL语句进行的操作;分析SQL语句相关的性能问题或仅仅质疑查询优化器的决定时,必须知道执行计划;所以执行计划常用于sql调优。

2.查看执行计划

2.1、方法一:explain plan for SQL

explain plan for select * from emp;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

2.2、方法二:AUTOTRACE命令

  • SET AUTOTRACE ON
2.2.1、执行 SQL 会显示执行计划

显示执行计划和统计信息:set autotrace traceonly

只显示执行计划:set autotrace traceonly explain

只显示统计信息:set autotrace traceonly statistics

显示结果集,执行计划和统计信息:set autotrace on

显示结果集,执行计划:set autotrace on explain


显示结果集,统计信息:set autotrace on statistics

不过如果是使用PLSQL的话,那就可以使用PLSQL提供的查询执行计划了,也就是按F5

打开PLSQL工具 -> 首选项 -> 窗口类型 -> 计划窗口 ,在这里加入执行计划需要的参数

解释一下这些参数的意思:

  • 基数(Rows):Oracle估计的当前步骤的返回结果集行数
  • 字节(Bytes):执行SQL对应步骤返回的字节数
  • 耗费(COST)、CPU耗费:Oracle估计的该步骤的执行耗费和CPU耗费
  • 时间(Time):Oracle估计的执行sql对于步骤需要的时间

2.3 查看真实执行计划

declareb1 date;
beginexecute immediate 'alter session set statistics_level=ALL';b1 := sysdate - 1;for test in (/*业务SQL(sql后面不需要加";")*/select * from emp) loopnull;end loop;for x in (select p.plan_table_outputfrom table(dbms_xplan.display_cursor(null,null,'advanced -bytes -PROJECTION allstats last')) p) loopdbms_output.put_line(x.plan_table_output);end loop;rollback;
end;

关键信息解释:

  • Starts:该SQL执行的次数
  • E-Rows:为执行计划预计的行数
  • A-Rows:实际返回的行数,E-Rows和A-Rows作比较,就可以看出具体那一步执行计划出问题了
  • A-Time:每一步实际执行的时间,可以看出耗时的SQL
  • Buffers:每一步实际执行的逻辑读或一致性读

2.4 explain执行顺序

所以不管是用F5方式还是set statistics_level=ALL方式,都有Operation参数,Operation表示sql执行过程,查看怎么执行的,有两个规则:

  • 根据Operation缩进判断,缩进最多的最先执行;
  • Operation缩进相同时,最上面的是最先执行的;

2.5 访问数据的方法

Oracle的优化器共有两种的优化方式,基于规则的优化方式(Rule-Based Optimization,简称为RBO)基于代价的优化方式(Cost-Based Optimization,简称为CBO)

2.5.1 全表扫描(TABLE ACCESS FULL)

        全表扫描是Oracle直接访问数据的一种方法,全表扫描时从第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描的到表的高水位线(High Water Mark),这个范围内的数据块都会扫描

        全表扫描是采用多数据块一起扫的,并不是一个个数据库扫的,然后我们经常说全表扫描慢是针对数据量很多的情况,数据量少的话,全表扫描并不慢的,不过随着数据量越多,高水位线也就越高,也就是说需要扫描的数据库越多,自然扫描所需要的IO越多,时间也越多

2.5.2 ROWID扫描(TABLE ACCESS BY ROWID)效率最高

        ROWID也就是表数据行所在的物理存储地址,所谓的ROWID扫描是通过ROWID所在的数据行记录去定位。ROWID是一个伪列,数据库里并没有这个列,它是数据库查询过程中获取的一个物理地址,用于表示数据对应的行数。

        随意获取一个ROWID序列:AAAWSJAAFAAAWwUAAA,前6位表示对象编号(Data Object number),其后3位文件编号(Relative file number),接着其后6位表示块编号(Block number), 再其后3位表示行编号(Row number)

ROWID编码方法是:A ~ Z表示0到25;a ~ z表示26到51;0~9表示52到61;+表示62;/表示63;刚好64个字符。

访问索引(TABLE ACCESS BY INDEX SCAN)的情况就比较多了,可以分为:
索引唯一扫描(INDEX UNIQUE SCAN)

        索引唯一性扫描(INDEX UNIQUE SCAN)是针对唯一性索引(UNIQUE INDEX)来说的,也就是建立唯一性索引才能索引唯一性扫描,唯一性扫描,其结果集只会返回一条记录。

索引范围扫描(INDEX RANGE SCAN)

        索引范围扫描(INDEX RANGE SCAN)适用于所有类型的B树索引,一般不包括唯一性索引,因为唯一性索引走索引唯一性扫描。 当扫描的对象是非唯一性索引的情况,where谓词条件为Between、=、<、>等等的情况就是索引范围扫描,注意,可以是等值查询,也可以是范围查询。如果where条件里有一个索引键值列没限定为非空的,那就可以走索引范围扫描,如果索引列是非空的,那就走索引全扫描**

 索引全扫描(INDEX FULL SCAN)

索引全扫描(INDEX FULL SCAN)适用于所有类型的B树索引(包括唯一性索引和非唯一性索引)。

        索引全扫描是指扫描目标索引所有叶子块的索引行,但不意思着需要扫描所有的分支块,索引全扫描时只需要访问必要的分支块,然后定位到位于该索引最左边的叶子块的第一行索引行,就可以利用该索引叶子块之间的双向指针链表,从左往右依次顺序扫描所有的叶子块的索引行

索引快速全扫描(INDEX FAST FULL SCAN)

        索引快速全扫描和索引全扫描很类似,也适用于所有类型的B树索引(包括唯一性索引和非唯一性索引)。和索引全扫描类似,也是扫描所有叶子块的索引行,这些都是索引快速全扫描和索引全扫描的相同点

索引快速全扫描和索引全扫描区别

  • 索引快速全扫描只适应于CBO(基于成本的优化器)
  • 索引快速全扫描可以使用多块读,也可以并行执行
  • 索引全扫描会按照叶子块排序返回,而索引快速全扫描则是按照索引段内存储块顺序返回
  • 索引快速全扫描的执行结果不一定是有序的,而索引全扫描的执行结果是有序的,因为索引快速全扫描是根据索引行在磁盘的物理存储顺序来扫描的,不是根据索引行的逻辑顺序来扫描的
索引跳跃式扫描(INDEX SKIP SCAN)

        索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的复合B树索引(包括唯一性索引和非唯一性索引),索引跳跃式扫描可以使那些在where条件中没有目标索引的前导列指定查询条件但是有索引的非前导列指定查询条件的目标SQL依然可以使用跳跃索引

2.6 表连接方法

排序合并连接(merge sort join)

        merge sort join是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配.

经常会使用一些非等值连接一些表关联中,并且如果在关联之前已经对数据排好序,则他的效率是高于hash join.

嵌套循环连接(Nested loop join)

        Nested loops 工作方式是循环从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,通常有索引)。驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。对于被连接的数据子集较小的情况,nested loop连接是个较好的选择

哈希连接(Hash join)

        散列连接是 CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。

使用场景:1.表的数据量比较小,或者一张大表和一张小表关联。
                      2.hash连接只适用于等值连接

3. 修改执行计划

hints是Oralce中提供的一种特殊的语法结果,在sql语句中嵌入一些语句,来改变sql语句原来的执行方式。

语句级别:用 Hint (/*+ ... */) 来设定
Select /*+ first_rows(10) */ name from table ;

 ALL_ROWS

        ALL_ROWS是针对整个目标SQL的Hint,它的含义是让优化器启用CBO,而且在得到目标SQL的执行计划时会选择那些 吞吐量 最佳的执行路径。 FIRST_ROWS(n) FIRST_ROWS(n)

FIRST_ROWS(n)

        FIRST_ROWS(n)是针对整个目标SQL的Hint,它的含义是让优化器启用CBO模式,而且在得到目标SQL的执行计划时会选择那些得以最快响应并返回头n条记录的执行路径.如果在UPDATE、DELETE或者含如下内容的查询语句中使用了FIRST_ROWS(n) Hint,则该FIRST_ROWS(n) Hint会被Oracle忽略。

如下内容的查询语句:

  • 集合运算(如UNION、INTERSECT、MINUS、UNION ALL等)
  • GROUP BY
  • FOR UPDATE
  • 聚合函数(比如SUM等)
  • DISTINCT
  • ORDER BY(对应的排序列上没有索引)

RULE

        RULE是针对整个SQL的Hint,它表示对目标SQL启用RBO。RULE与其他Hint:RULE通常不能与除DRIVING_SITE以外的Hint联用,当RULE与除DRIVING_SITE以外的Hint联用时,其他的Hint可能会失效。但是,当RULE和DRIVING_SITE联用时,它自身可能会失效,所以RULE Hint最好是单独使用。Oracle早就不支持RBO了,二是因为启用RBO后优化器在执行目标SQL时选择的执行路径将大大减少,很多执行路径RBO根本就不支持(比如哈希连接),这也就意味着启用RBO后目标SQL跑出正确执行计划的概率将大大降低。

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

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

相关文章

生活服务推出品牌实惠团购,覆盖五一假期“吃喝玩乐”多场景

4月26日&#xff0c;抖音生活服务平台上线“跟着大牌过五一”活动会场&#xff0c;携手22家连锁品牌商家&#xff0c;于“五一”前推出优价团购和时令新品&#xff0c;覆盖“吃喝玩乐”多重购物需求&#xff0c;助力假期消费。同时&#xff0c;伴随各地涌现的文旅热潮&#xff…

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数

问题预览/关键词 本节课内容逻辑回归的损失函数简化之后的形式是&#xff1f;为什么可以简化&#xff1f;成本函数的通用形式是&#xff1f;逻辑回归成本函数的最终形式是&#xff1f;逻辑回归为什么用对数损失函数计算成本函数&#xff1f;为什么不直接给出逻辑回归损失函数的…

mysql使用.idb文件恢复数据

1、把.idb文件拷贝到mysql数据库的data文件夹的对应的数据库里&#xff08;mysql的目录结构一般是/mysql/data/数据库名称&#xff09; 2、使用命令查看当前文件夹下所有.idb文件的权限&#xff08;以下是查看所有文件详情的命令&#xff09; ll 效果图&#xff1a; 我这里其…

配置nodejs的俩小脚本

介绍&#xff1a;共两个脚本。 脚本1&#xff0c;用来配置环境变量&#xff0c;生成环境变量所需的配置信息&#xff0c;然后自己添加到系统环境变量里去 特别注意&#xff1a;该脚本需要放到nodejs目录下面&#xff0c;如果不是&#xff0c;则无法生成环境变量配置文本内容 另…

leetcode1143. 最长公共子序列(ACM模式解法)

题目描述 给你一个序列X和另一个序列Z&#xff0c;当Z中的所有元素都在X中存在&#xff0c;并且在X中的下标顺序是严格递增的&#xff0c;那么就把Z叫做X的子序列。 例如&#xff1a;Z是序列X的一个子序列&#xff0c;Z中的元素在X中的下标序列为<1,2,4,6>。 现给你两个…

人形机器人核心架构梳理

定义&#xff1a;机器人是能进行运动、操纵或定位且具有一定程度自主能力的可编程执行机构。按外在形态分类可分为传统机器人和人形机器人&#xff0c;其中人形机器人是一种利用人工智能和机器人技术制造的具有类似人类外观和行为的机器人。 人形机器人发展历程&#xff1a; 人…

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容&#xff0c;Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion&#xff0c;是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布&#xff0c;主要用于根据文本的描述产生详细图像&…

华院计算登榜『2024福布斯中国人工智能科技企业TOP 50』

4月28日&#xff0c;福布斯中国正式发布“2024福布斯中国人工智能科技企业TOP 50”榜单。华院计算凭借其在人工智能领域的卓越成就与深远影响力&#xff0c;荣膺殊荣&#xff0c;成功跻身榜单。 工业和信息化部2024年4月表示&#xff0c;中国人工智能企业数量已超过4,500家。AI…

图搜索算法详解:广度优先搜索与深度优先搜索的探索之旅

图搜索算法详解&#xff1a;广度优先搜索与深度优先搜索的探索之旅 1. 广度优先搜索&#xff08;BFS&#xff09;1.1 伪代码1.2 C语言实现 2. 深度优先搜索&#xff08;DFS&#xff09;2.1 伪代码2.2 C语言实现 3. 总结 图搜索算法是计算机科学中用于在图结构中查找路径的算法。…

Phi-3-mini-4k-instruct 的功能测试

Model card 介绍 Phi-3-Mini-4K-Instruct 是一个 3.8B 参数、轻量级、最先进的开放模型&#xff0c;使用 Phi-3 数据集进行训练&#xff0c;其中包括合成数据和经过过滤的公开可用网站数据&#xff0c;重点是 高品质和推理密集的属性。 该型号属于 Phi-3 系列&#xff0c;Mini…

牛客热题:合并升序链表

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;合并升序链表题目链接方法一&am…

Python --- 新手小白自己动手安装Anaconda+Jupyter Notebook全记录(Windows平台)

新手小白自己动手安装AnacondaJupyter Notebook全记录 这两天在家学Pythonmathine learning&#xff0c;在我刚刚入手python的时候&#xff0c;我写了一篇新手的入手文章&#xff0c;是基于Vs code编译器的入手指南&#xff0c;里面包括如何安装python&#xff0c;以及如何在Vs…

使用riscv-tests进行指令测试(二)

使用riscv-tests进行指令测试&#xff08;二&#xff09; 1 测试用例命名规则2 测试用例dump文件介绍 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 测试用例命名规则 用例名称 TVM Name “-” Target Environment Name “-” “指令”…

面试题:分布式消息中间件 MQ

MQ官网文档&#xff1a; RabbitMQ&#xff1a;https://www.rabbitmq.com/docs RocketMQ&#xff1a;https://rocketmq.apache.org/zh/docs/ Kafka&#xff1a;https://kafka.apache.org/documentation/ DDMQ&#xff1a;https://base.xiaojukeji.com/docs/ddmq 面试题&#xff…

场景文本检测识别学习 day07(BERT论文精读)

BERT 在CV领域&#xff0c;可以通过训练一个大的CNN模型作为预训练模型&#xff0c;来帮助其他任务提高各自模型的性能&#xff0c;但是在NLP领域&#xff0c;没有这样的模型&#xff0c;而BERT的提出&#xff0c;解决了这个问题BERT和GPT、ELMO的区别&#xff1a; BERT是用来…

微信小程序:11.本地生活小程序制作

开发工具&#xff1a; 微信开发者工具apifox进行创先Mock 项目初始化 新建小程序项目输入ID选择不使用云开发&#xff0c;js传统模版在project.private.config中setting配置项中配置checkinalidKey&#xff1a;false 梳理项目结构 因为该项目有三个tabbar所以我们要创建三…

springboot拦载器

1、拦载器 package com.Interceptor;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.security.auth.login.Log…

Linux基本指令(3)

目录 时间相关的指令&#xff1a; 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设定为一个加好后接数个标记&#xff0c;其中常用的标记列表如下&#xff1a; 2.在设定时间方面&#xff1a; 3.时间戳&#xff1a; Cal指令&#xff1a; find指令&a…

部署YUM仓库和NFS共享存储服务

目录 1. YUM仓库服务 1.1 YUM概述 1.2 准备安装源 1.3 yum在线源替换方法 2.制作YUM源 2.1制作ftp源 3.yum软件包的下载方式 4.NFS共享存储服务 4.1 NFS 4.2 NFS网络文件系统 4.3 NFS配置 1. YUM仓库服务 1.1 YUM概述 yum是一个基于RPM包&#xff08;是Red-Ha…

Java包装类,128陷阱

包装类 基本数据类型都有自己对应的包装类&#xff0c;因为Java本质是面向对象编程的&#xff0c;一切的内容在Java看来都是对象 但是基本数据类型没有类&#xff0c;也没有对象&#xff0c;这样就有了矛盾 所以诞生了基本类型的包装类 基本数据类型&#xff1a; byte,short,…