Oracal执行计划解析

概述

| Id  | Operation              | Name                  | Rows  | Bytes | TempSpc | Cost (%CPU) | Time     |
-----------------------------------------------------------------------------------
| 0   | SELECT STATEMENT       |                       | 10000 | 120000| 0       | 20000 (100)| 00:00:01 |
| 1   | SORT AGGREGATE         |                       | 1     | 120   |          | 20000 (100)|          |
| 2   | INDEX FAST FULL SCAN   | IDX_Employee_LastName | 10000 | 120000| 0       | 10000  (10)|          |解释:
| Id  | - 表示执行计划的步骤编号,从0开始,按执行顺序递增。
| Operation | - 描述数据库执行的具体操作类型,如:SELECT STATEMENT、SORT AGGREGATE、INDEX FULL SCAN等。
| Name      | - 操作所涉及的对象名称,如索引名、表名等。
| Rows      | - 预估的执行此操作将读取或产生的行数,是Oracle优化器根据统计信息做出的估算。
| Bytes     | - 预估处理的字节数,反映了操作所需处理的数据量。
| TempSpc   | - 指定此步骤是否会使用临时段(临时空间),如果是,显示所需的临时空间大小(单位通常是KB)。
| Cost (%CPU)| - 执行此步骤的总成本估计,包括CPU成本和I/O成本,用于衡量不同执行计划的相对代价。
| Time      | - 预测的执行时间,但通常在实际运行中会有差异,主要用于优化器决策。举例说明:
第一行表示整个SQL语句(SELECT STATEMENT),预估处理10000行数据,总共120000字节,总成本是20000(其中100%是CPU成本),预计耗时1秒。
第二行是一个排序聚合操作(SORT AGGREGATE),生成1行结果,共120字节。
第三行是一个索引快速全扫描(INDEX FAST FULL SCAN),同样处理10000行数据,总成本较低,使用索引IDX_Employee_LastName进行扫描,不需要临时空间。

使用方式

EXPLAIN PLAN FOR 查询语句

ID(每个流程的唯一标识):

ID(Id)列代表了执行计划中不同操作步骤的唯一标识符。
即:每个流程的唯一标识

Operation(具体操作,执行顺序):

“Operation”列展示了数据库为了执行SQL语句而采取的不同操作步骤。这些操作涵盖了从数据源访问、过滤、排序、连接、聚合等多种数据库内部处理行为
1:执行的操作
2:执行的顺序(缩进越多,越先执行)
同一级的动作执行时遵循最上最右先执行的原则

可能会出现操作明细

1. SELECT STATEMENT:

    • 整个查询的起点,标识SQL语句的整体执行计划。

2. 全表扫描:TABLE ACCESS FULL:

    • 全表扫描,即对整个表的所有数据进行线性读取,没有利用任何索引。

3. 索引扫描:INDEX SCAN:

    • 索引扫描,包括但不限于:
      • INDEX RANGE SCAN: 根据索引范围条件检索数据。
      • INDEX UNIQUE SCAN: 当唯一索引被用来直接定位一行数据时。
      • INDEX FAST FULL SCAN: 对索引进行类似全表扫描的操作,但比全表扫描可能更快,因为它可能避免了额外的排序和行链接操作。

4. 排序:SORT:

    • 排序操作,例如:
      • SORT ORDER BY
      • SORT GROUP BY: 对数据进行分组前的排序。
      • SORT AGGREGATE: 聚合操作,如SUM、COUNT、AVG等,可能伴随排序。

5. 表连接方式:JOIN:

    • 表连接操作,例如:
a. 嵌套循环连接:小表连大表:NESTED LOOPS JOIN: 最常见的连接类型之一。
工作原理: 嵌套循环连接是最基础的连接方法,它的工作原理类似于嵌套循环,外层循环逐行遍历一个表,内层循环则针对每一行去另一个表中查找匹配的记录。其性能很大程度上依赖于内外表的大小以及索引的有效性。性能特点:当外表较小或者内外表之间有很好的索引关联时(如外表通过主键连接内表的唯一索引),嵌套循环连接效率非常高。
若外表庞大而内表没有合适的索引,或者连接条件没有利用到索引,这种连接方式可能会很慢,因为它可能需要进行大量的索引查找或全表扫描。
b. 合并连接(内存不足用这个):排序好的表进行连接:MERGE JOIN: ,适用于已经排序或者部分排序的数据。
工作原理: 合并连接要求两个表都已经排序好(或者可以利用现有索引达到排序效果),然后将两个排序好的数据流进行合并,匹配相同的键值来进行连接。合并连接可以有效地利用索引和排序,无需额外的临时空间。
性能特点:
● 当两个表都很大,但都已排序或可以利用索引进行有效的排序时,合并连接效率很高。
● 如果数据量巨大,内存不足以一次性装入所有数据,但有足够的磁盘空间和合理的I/O速度,合并连接可以通过多轮排序和合并逐步完成,性能较好。
c. HASH JOIN: 使用哈希算法来匹配两表之间的记录。

6. 哈希连接(HASH JOIN)

工作原理: 哈希连接首先将一方表构建哈希表,然后扫描另一方表,对每一行计算哈希值并查找哈希表,通过哈希索引快速找到匹配项。哈希连接需要足够的内存来存储哈希表。
性能特点:
● 当两个表都非常大,并且内存充足时,哈希连接通常比嵌套循环连接更快,因为它避免了大量索引查找操作。
● 如果内存不足,哈希连接可能需要溢出到磁盘,这会显著降低性能,但即使如此,有时仍可能比其他连接方式更快,尤其是在大规模数据处理中。
总结起来,选择哪种连接方式最为高效,通常取决于表的大小、索引的存在和有效性、内存资源、磁盘I/O能力等因素。在实际应用中,Oracle数据库的优化器会根据统计信息和成本模型自动选择最优的连接方式。在特定场景下,也可能需要通过手工hints等方式指导优化器选择合适的连接方法。

7. 过滤:FILTER:

    • 过滤操作,应用于WHERE子句中的条件筛选。

8. INDEX SKIP SCAN:

    • 索引跳跃扫描,仅读取索引的一部分来满足查询需求。

9. 分区操作:PARTITION RANGE ALL / SINGLE / ITERATOR:

    • 分区表相关的扫描操作,针对分区表中的特定分区或所有分区。

10. 视图操作:VIEW:

    • 视图操作,数据库处理视图逻辑的方式。

11. rowID查询:TABLE ACCESS BY INDEX ROWID:

    • 通过索引获取行地址(ROWID),随后进行单行的表访问。

每一个“Operation”都是SQL执行流程中的一个阶段,Oracle优化器会选择成本最低的执行路径来执行SQL语句,从而尽可能提高查询效率。通过分析执行计划中的Operation序列,可以深入了解数据库是如何实际处理SQL查询请求的,并据此进行性能优化。

备注:表的访问方式

● 全表扫描table access full

  • Oracle 会读取表中所有的行,并检查每一行是否满足 where 限制条件
  • 全表扫描时可以使用多块读(一次 I/O 读取多块数据块)操作,提升吞吐量

● rowid 扫描table access by rowid(单行存取他最快)

  • rowid:伪列,Oracle 自带的,不会存储 rowid 的值,不能被增、删、改
  • 一旦一行数据插入后,则其对应的 rowid 在该行的生命周期内是唯一的,即使发生行迁移,该行的 rowid 值也不变

简述:查询时,先找索引树,根据索引树存储的rowid信息,拿到rowid对应的行。

rowid简述:行的唯一ID。(还包含有关数据在数据库物理存储结构中的具体位置信息。)

● 索引扫描table access by index scan

索引唯一扫描:index unique scan(主键唯一索引专用,只返回一条数据)
  • 每次至多返回一条记录
  • 有下列两种情况(当查询字段有下列约束时)
    • unique (唯一索引)
    • primary key (主键ID)
索引范围扫描:index range scan(携带范围条件会用他)
  • 每次至少返回一条记录
  • 一般有下列三种情况
    • 在唯一索引列上使用了范围操作符(如:> < >= <= between)
    • 在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)
    • 对非唯一索引列上进行的任何查询

索引全表扫描:index full scan

扫描索引并排序返回

索引快速扫描:index fast full scan

扫描索引 不 排序返回

索引跳跃扫描(组合索引专用):index skip scan
  • 必须是 组合索引
  • 除了前导列(索引中第一列)外的其他列作为条件

说明了:MYSQL不允许打破的规则被ORACAL打破了 (本人的理解)

ABC为联合索引,

MYSQL:可用:A,AB,ABC

ORACAL:A,AB,ABC,AC,BC

NAME(每个步骤涉及的表名,索引名等)

"Name"列通常表示的是执行计划中涉及的具体数据库对象,例如表名、索引名、视图名或者是其他类型的数据库对象,如分区、物化视图等。每个操作步骤(Operation)都会关联到一个或多个数据库对象,"Name"列就用来展示这些操作所作用的具体对象。
| Id  | Operation          | Name                 |
-------------------------------------------------
|   1 | TABLE ACCESS FULL  | Customers            |
|   2 | INDEX RANGE SCAN   | PK_Products          |
|   3 | SORT JOIN          |                      |
|   4 | TABLE ACCESS BY INDEX ROWID| Orders |
  • 在第一个操作步骤中,"Name"是"Customers",表示执行了一个全表扫描操作在"Customers"表上。
  • 第二个步骤使用了名为"PK_Products"的索引进行了索引范围扫描。
  • 第四个步骤使用索引行ID访问了"Orders"表,这里的"Name"为空是因为该步骤是通过前面的索引扫描间接访问的。

通过分析执行计划中的"Name"列,我们可以清楚地了解到数据库执行SQL语句时访问的具体数据来源,这对于性能调优和理解查询执行过程至关重要。

Rows(操作预计涉及的行数)

K是千

M是万

Bytes(预计处理的数据量)

TempSpc(临时表)

存在此行,说明使用临时表,展示的是临时表占用的内存。

不存在此行,说明未使用临时表

Cost (%CPU) (预计CPU使用情况)

Cost (%CPU)列表示Oracle优化器对执行某个操作预计耗费的CPU成本的度量。这个成本不仅包括CPU时间,还包括内存和I/O操作的成本,但通常以CPU时间作为主要参考基准。Cost (%CPU)列的值是一个相对成本,用于比较不同执行计划的成本,从而帮助优化器选择成本最低的执行计划。

| Id  | Operation          | Name                 | Rows  | Bytes | Cost (%CPU) |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                     |  1000 |  8000 |   10000 (1) |
|   1 |  SORT AGGREGATE    |                     |     1 |    12 |    1000 (1) |
|   2 |   TABLE ACCESS FULL| Employees            |  1000 |  8000 |    1000 (1) |

在这个例子中:

  • Id 为 2 的 TABLE ACCESS FULL 操作预计的总成本是 1000 (1),这意味着Oracle估计执行全表扫描 Employees 表大概会花费相当于1000个CPU单位的工作量,其中 (1) 表示大致的CPU成本占比为100%。
  • Id 为 1 的 SORT AGGREGATE 操作预计的成本是 1000 (1),这表示排序和聚合操作大约需要1000个CPU单位的工作量。
  • Id 为 0 的 SELECT STATEMENT 总体成本是 10000 (1),这是整个查询的预计总成本,包括子操作的成本。

优化器会综合考虑Cost (%CPU)以及其他因素(如Rows、Bytes、TempSpc等)来确定最佳执行计划,旨在选择成本最低且能最快得到查询结果的方案。但要注意,实际运行时的成本可能会与预估成本有所出入,因为预估是基于当前的统计信息和Oracle的优化算法得出的。

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

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

相关文章

论文笔记:TALK LIKE A GRAPH: ENCODING GRAPHS FORLARGE LANGUAGE MODELS

ICLR 2024&#xff0c;reviewer评分 6666 1 intro 1.1 背景 当下LLM的限制 限制1&#xff1a;对非结构化文本的依赖 ——>模型有时会错过明显的逻辑推理或产生错误的结论限制2&#xff1a;LLMs本质上受到它们训练时间的限制&#xff0c;将“最新”信息纳入到不断变化的世…

如何注册谷歌邮箱gmail

不知道大家在工作生活中有没有需要用到谷歌邮箱的地方&#xff0c;但是最近我就用到了它。因为注册ChatGPT的事&#xff0c;用了outlook&#xff0c;hotmail邮箱注册的gpt账号都被封了&#xff0c;然后通过各方面的了解&#xff0c;发现谷歌的邮箱是没有问题的&#xff0c;不会…

Portal Particle

Unity3D Portal Particle 2.2传送门粒子效果 链接&#xff1a;https://pan.baidu.com/s/1TCMXIif5d288lXHgixnDPw?pwd1234 下载&#xff1a;资源下载链接 效果图&#xff1a;

生态鱼缸智能养殖,系统架构与框图

功能&#xff1a;自动投食&#xff08;推拉式电磁铁&#xff09;&#xff0c;温度显示的改进&#xff08;传感器已经有了&#xff09;&#xff0c;控制灯光&#xff08;白天亮晚上灭&#xff09;&#xff0c;自动补养/水循环&#xff08;水氧监测太贵了&#xff0c;根据水温&am…

Redis基础数据结构及操作命令解析

Redis基础数据结构及操作命令解析 Redis有五种基础数据结构&#xff0c;分别为string、list、hash、set、zset。 字符串类型&#xff08;string&#xff09; 字符串类型是Redis中最基本的数据类型&#xff0c;它能存储任何形式的字符串&#xff0c;包括二进制数据、JSON化的对…

【前端面试3+1】05v-if和v-show的区别、v-if和v-for能同时使用吗、Vuex是什么?【合并两个有序链表】

一、v-if和v-show的区别 v-if 和 v-show 是 Vue.js 中用来控制元素显示与隐藏的指令。 1.v-if&#xff1a; v-if 是根据表达式的真假值来决定是否渲染元素。当表达式为真时&#xff0c;元素会被渲染到 DOM 中&#xff1b;当表达式为假时&#xff0c;元素不会被渲染到 DOM 中。每…

关于未来自我的发展和一些学习方法(嵌入式方向)

我是一名大二的学生&#xff0c;考研还是就业&#xff0c;到底是重视专业课还是重视数学英语&#xff0c;这些问题一直困扰了我很久&#xff0c;但如今已经有了一些浅显的认识&#xff0c;所以才会想写这样一篇文章来记录一下自己的状态和未来的规划 下面的看法都是个人的看法&…

报错:torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

错误&#xff1a; torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 这个主要是torch的gpu版本和cuda不适配 我的nvcc -V是11.8 torch使用的&#xff1a; pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pyt…

最长有效括号(C语言)

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 这道题&#xff0c;我看了一种解法&#xff0c;觉得很好&#xff0c;来分享一下 这道题主要是 思考 当前 ) 与之匹配 ( 在哪里 &#xff0c;记录下来&#xff0c;最后比较最大值 例子&#xff1a; 第…

听了中国电信关闭Wi-Fi双频合一功能之后,到底该连接2.4GHz还是5GHz频段?

前言 前段时间沸沸扬扬的关闭双频合一建议&#xff0c;小白也尝试关闭了一下&#xff0c;网络确实是好了不少。 有小伙伴还是有点疑虑&#xff0c;中国电信说的关闭Wi-Fi双频合一功能真的有用吗&#xff1f;点击下方蓝字一探究竟&#xff01; 中国电信建议关闭路由器的双频合一…

万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

Sphinx查询性能非常厉害&#xff0c;亿级数据下输入关键字&#xff0c;大部分能在0.01~0.1秒&#xff0c;少部分再5秒之内查出数据。 Sphinx 官方文档&#xff1a;http://sphinxsearch.com/docs/sphinx3.html极简概括&#xff1a; 由C编写的高性能全文搜索引擎的开源组件&…

Python-基础部署

机器没法直接读懂我们写的代码&#xff0c;需要解释解释器作为中间的翻译&#xff0c;把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目&#xff0c;每个项目里的文件夹…

Cisco ISR 1000 Series IOS XE Release IOSXE-17.13.1a ED

Cisco ISR 1000 Series IOS XE Release IOSXE-17.13.1a ED 思科 1000 系列集成多业务路由器系统软件 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-1000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科…

如何解决EventSource 删除单词的前置空格问题

如下代码,EventSource会把单词的前置空格吃掉&#xff0c;比如“ blank” 会变成"blank",这会导致输出的英语单词连在一起 const eventSource new EventSource(api_question); eventSource.onmessage streamEvent > {const data streamEvent.data;handleTest(…

ubuntu18.04 pycharm

一、下载pycharm &#xff08;1&#xff09;进入官网下载Download PyCharm: The Python IDE for data science and web development by JetBrains 选择专业版&#xff08;professional&#xff09;直接点击下载&#xff08;download&#xff09;&#xff0c;我下载的是2023.3…

数字孪生|初识山海鲸可视化

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近开始学习了解数字孪生的软件&#xff0c;看山海鲸可视化介绍的不错&#xff0c;便准备下载了试一下。 01 、概述 该软件是一套技术自主可控的、国产自研的、零代码数字孪生可视化工具集&#xff0c; 02、产品定…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了&#xff0c;既然低代码很好&#xff0c;为什么突然又自己架构起后端了呢&#xff1f;我有一句话叫低代码…

EasyRecovery2024中文版数据恢复软件功能全面介绍

EasyRecovery2024是世界著名数据恢复公司 Ontrack 的技术杰作&#xff0c;它是一个威力非常强大的硬盘数据恢复工具。能够帮你恢复丢失的数据以及重建文件系统。 EasyRecovery不会向你的原始驱动器写入任何东东&#xff0c;它主要是在内存中重建文件分区表使数据能够安全地传输…

C语言如何进⾏函数的⼀般调⽤?

一、问题 函数调⽤的⼀般样式都是⼀样的&#xff0c;简称为函数的⼀般调⽤&#xff0c;那么函数的⼀般调⽤的形式是什么呢&#xff1f; 二、解答 在C语⾔中&#xff0c;函数调⽤的⼀般形式如下。 函数名(实际参数表) 对⽆参函数调⽤时&#xff0c;则⽆实际参数表。实际参数表…

nodejs下载安装以及npm、yarn安装及配置教程

1、nodejs下载安装 ​ 1.1、使用nodejs版本管理工具下载安装&#xff0c;可一键安装、切换不同nodejs版本&#xff0c; nvm-setup.zip&#xff1a;安装版&#xff0c;推荐使用 本次演示的是安装版。 1、双击安装文件 nvm-setup.exe 选择nvm安装路径 例如&#xff1a;E:\Soft…