Oracle 数据库执行计划的查看与分析技巧

目录

  • Oracle 数据库执行计划的查看与分析技巧
    • 一、什么是执行计划
    • 二、查看执行计划的方法
      • (一)使用 EXPLAIN PLAN 命令
      • (二)通过 SQL Developer 工具查看
      • (三)启用 AUTOTRACE 功能
    • 三、执行计划中的关键信息解读
      • (一)操作类型
        • 全表扫描(TABLE ACCESS FULL)
        • 索引扫描(INDEX SCAN)
        • 嵌套循环连接(NESTED LOOPS)
        • 哈希连接(HASH JOIN)
      • (二)执行顺序
      • (三)谓词信息
    • 四、分析执行计划的技巧
      • (一)关注高成本操作
      • (二)结合数据量与分布情况
      • (三)对比不同执行计划版本
    • 五、优化执行计划的案例
    • 总结

Oracle 数据库执行计划的查看与分析技巧

在 Oracle 数据库中,执行计划能够帮助我们深入了解 SQL 语句在数据库内部的执行细节,进而优化查询性能、提升系统效率。无论是数据库领域的新手,还是经验丰富的工程师,掌握执行计划的查看与分析方法都至关重要。

一、什么是执行计划

执行计划是 Oracle 数据库优化器为 SQL 语句生成的一种执行蓝图,它描述了数据库将如何检索数据以满足查询要求。简单来说,执行计划告诉我们 SQL 语句的各个步骤,例如通过哪些索引进行数据查找、表之间以何种连接方式关联、数据如何排序等操作的先后顺序。优化器会基于数据库对象的统计信息、SQL 语句的语法结构以及数据库的配置参数等因素,综合考量来生成它认为最优的执行计划。

二、查看执行计划的方法

(一)使用 EXPLAIN PLAN 命令

这是最基础、也是最常用的查看执行计划的方式之一。它的语法如下:

EXPLAIN PLAN FOR
<your_sql_statement>;SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

例如,我们有一个简单的查询语句,用于从员工表(employees)和部门表(departments)中检索特定部门的员工信息:

EXPLAIN PLAN FOR
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

执行上述代码后,第二句查询会以表格形式展示出详细的执行计划。其中包括各操作的 ID、操作名称(如 TABLE ACCESS FULL 表示全表扫描,INDEX RANGE SCAN 表示索引范围扫描等)、对象名称(涉及的表或索引)以及执行顺序等关键信息。

(二)通过 SQL Developer 工具查看

SQL Developer 是 Oracle 官方提供的一款功能强大的数据库开发工具。在使用它执行 SQL 语句时,可以方便地同时查看对应的执行计划。只需在执行 SQL 的窗口中,点击 “解释计划” 按钮(通常是一个带有放大镜和闪电标志的图标),工具就会在下方的面板中以可视化的树状结构展示执行计划。这种方式相较于命令行,更加直观,易于理解。各个节点展示了详细的操作信息,并且可以通过鼠标悬停查看更多细节,如谓词信息(WHERE 子句中的过滤条件)等。

(三)启用 AUTOTRACE 功能

在 SQL*Plus 环境下,我们可以启用 AUTOTRACE 来查看执行计划及相关的执行统计信息,如物理读、逻辑读、执行时间等。首先需要确保当前用户具有执行 AUTOTRACE 相关权限,并且数据库实例已正确配置。启用 AUTOTRACE 的命令如下:

SET AUTOTRACE ON;

之后执行 SQL 语句,例如:

SELECT * FROM customers WHERE customer_city = 'New York';

执行完 SQL 后,除了返回查询结果,还会输出执行计划的概要信息以及上述提到的统计信息。这对于快速评估 SQL 语句的性能开销非常有帮助。要关闭 AUTOTRACE 功能,使用:

SET AUTOTRACE OFF;

三、执行计划中的关键信息解读

(一)操作类型

全表扫描(TABLE ACCESS FULL)

这意味着数据库会读取表中的所有行来满足查询条件。当没有合适的索引可用,或者优化器认为全表扫描的成本更低时,会选择这种方式。例如,在一个数据量较小的表上进行没有过滤条件或过滤条件选择性很差的,全表扫描可能是最快的方法。但对于大表,全表扫描通常会导致大量的 I/O 操作,严重影响性能。

索引扫描(INDEX SCAN)

又分为索引唯一扫描(INDEX UNIQUE SCAN)、索引范围扫描(INDEX RANGE SCAN)等。索引唯一扫描用于查找具有唯一键值的行,比如通过主键查询单条记录。索引范围扫描则适用于基于某个范围条件的查询,如查询某个时间段内的数据,它会利用索引的有序性快速定位到符合条件的起始和结束位置,并扫描其间的索引条目。

嵌套循环连接(NESTED LOOPS)

这是一种常见的表连接方式,对于外部表的每一行,都会在内层表中查找匹配的行。它适用于连接条件选择性高、关联表数据量较小的场景。优点是能快速返回少量精确匹配的结果,但如果表数据量大,可能会产生大量的循环操作,性能急剧下降。

哈希连接(HASH JOIN)

先对一张表构建哈希表,然后利用哈希函数快速查找另一张表中匹配的行。通常在连接大数据集时表现较好,尤其是当两张表都比较大且没有合适索引的情况下,哈希连接能通过减少数据比较次数来提高连接效率。

(二)执行顺序

执行计划中的操作 ID 标识了各操作的执行顺序,通常是从缩进少的节点开始,逐步向缩进多的节点推进。数字越小,执行优先级越高。通过观察执行顺序,我们可以了解数据的流动方向,以及哪些操作是基础,哪些是后续基于前面结果的进一步处理。例如,先进行表的访问操作获取原始数据,然后可能进行过滤、连接等操作,最后进行排序或聚合等满足最终查询需求的步骤。

(三)谓词信息

谓词即 WHERE 子句中的过滤条件,在执行计划中会显示哪些谓词用于索引查找,哪些用于最终结果的过滤。如果某个谓词能够有效利用索引,说明该过滤条件具有较好的效果,可以快速缩小数据检索范围。反之,如果谓词只能在全表扫描后进行过滤,那可能需要考虑优化过滤条件或添加合适索引。例如,“WHERE column_name> 100 AND column_name < 200” 这样的范围谓词,若在索引列上,可能触发索引范围扫描;而 “WHERE function (column_name) = some_value”(函数作用于列上的条件),一般情况下会导致索引失效,引发全表扫描。

四、分析执行计划的技巧

(一)关注高成本操作

执行计划中的每个操作都有对应的成本估算,通常以 COST 值表示,包括 CPU 成本和 I/O 成本。重点关注成本较高的操作,这些往往是性能瓶颈所在。比如,当发现一个全表扫描操作的成本占比很大,且表数据量庞大时,就需要思考是否可以通过创建合适索引、优化查询条件等方式来改变执行计划,降低成本。可以通过对比不同优化方案下执行计划的成本变化,来评估优化效果。

(二)结合数据量与分布情况

了解表的实际数据量大小以及数据在索引列上的分布状况,对于准确分析执行计划至关重要。例如,一个索引在理论上看起来很完美,但如果表中的大部分数据在索引列上具有相同的值(数据倾斜),那么索引的选择性就会大打折扣,优化器可能会错误地选择使用这个低效的索引,导致性能问题。此时,可能需要考虑收集更准确的统计信息,或调整查询语句以适应数据分布特点,如增加额外的过滤条件来减少数据倾斜的影响。

(三)对比不同执行计划版本

在对 SQL 语句进行优化调整过程中,如修改索引、调整查询结构、更新数据库统计信息等操作后,重新查看并对比执行计划的变化。观察优化措施是否达到预期效果,新的执行计划中是否消除了高成本操作,数据检索路径是否更加合理。通过这种迭代式的对比分析,逐步逼近最优的查询性能。

五、优化执行计划的案例

假设我们有一个电商订单数据库,包含订单表(orders)、订单明细表(order_items)和产品表(products)。经常执行的查询是获取某个时间段内特定产品类别的订单总金额。初始查询语句如下:

SELECT p.product_category, SUM(oi.quantity * oi.unit_price) AS total_amount
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date BETWEEN '2024-01-01' AND '2023-01-31'
AND p.product_category = 'Electronics'
GROUP BY p.product_category;

使用 EXPLAIN PLAN 查看执行计划后,发现存在以下问题:
对订单表(orders)进行了全表扫描,因为 order_date 列没有合适索引,导致大量不必要的 I/O 操作,查询效率低下。
在连接操作中,由于表之间的连接条件选择性不是特别高,且没有充分利用索引,嵌套循环连接的成本较高。
优化方案:
在订单表的 order_date 列上创建索引:

CREATE INDEX idx_order_date ON orders(order_date);

分析产品表(products)上 product_category 列的数据分布,发现该列数据存在一定倾斜,部分类别数据量远大于其他类别。考虑收集更精确的统计信息:

BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname => 'your_schema', tabname => 'products');
END;

重新执行查询并查看执行计划,发现订单表改为使用索引范围扫描,大大减少了数据读取量;连接操作也因为统计信息的更新,优化器选择了更合适的哈希连接方式,整体查询性能提升了数倍,执行时间从原来的几十秒缩短到几秒。

总结

Oracle 数据库执行计划的查看与分析是数据库优化工作中的核心技能。通过熟练掌握多种查看执行计划的方法,深入解读其中的关键信息,并运用有效的分析技巧,我们能够精准定位 SQL 语句的性能问题,采取针对性的优化措施。从创建合适索引、优化查询语句结构,到确保准确的统计信息,每一个环节都可能成为提升数据库性能的关键。持续实践与经验积累,将帮助我们在面对复杂的数据库环境时,游刃有余地优化查询性能,保障系统高效稳定运行。

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

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

相关文章

【最新】沃德协会管理系统源码+uniapp前端+环境教程

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0…

【LeetCode: 83. 删除排序链表中的重复元素 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

算法练习——模拟题

前言&#xff1a;模拟题的特点在于没有什么固定的技巧&#xff0c;完全考验自己的代码能力&#xff0c;因此有助于提升自己的代码水平。如果说一定有什么技巧的话&#xff0c;那就是有的模拟题能够通过找规律来简化算法。 一&#xff1a;替换所有问号 题目要求&#xff1a; 解…

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…

VSCode设置Playwright教程

1.安装扩展 打开VS Code&#xff0c;在扩展—>搜索"Playwright Test for VSCode"&#xff0c;点击安装 按快捷键CommandShiftP&#xff0c;输入install playwright&#xff0c;点击安装Playwright 安装成功会有如下提示 2.调试脚本 打开tests/example.spec.ts文…

HTML新特性|01 音频视频

音频 1、Audio (音频) HTML5提供了播放音频文件的标准 2、control(控制器) control 属性供添加播放、暂停和音量控件 3、标签: <audio> 定义声音 <source> 规定多媒体资源,可以是多个<!DOCTYPE html> <html lang"en"> <head><…

【深度学习】卷积网络代码实战ResNet

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

雷电「模拟器」v9 最新清爽去广

前言 雷电模拟器9是基于安卓9内核开发的全新版本模拟器 安装环境 [名称]&#xff1a;雷电「模拟器」 [大小]&#xff1a;579MB [版本]&#xff1a;9.1.34 [语言]&#xff1a;简体中文 [安装环境]&#xff1a;Windows 通过网盘分享的文件&#xff1a;雷电模拟器 链接:…

大模型 API 接入初探

文章目录 大模型 API 接入初探一、使用大模型 API 的前置步骤&#xff08;一&#xff09;注册账户与获取凭证&#xff08;二&#xff09;理解 API 文档 二、三个常用 API&#xff08;一&#xff09;列出模型&#xff08;二&#xff09;FIM 补全&#xff08;三&#xff09;对话补…

实时在线翻译谷歌插件

Real - time Translation插件的安装 1、下载插件并解压 2、打开谷歌浏览器&#xff0c;在地址栏输入 “chrome://extensions/” 进入扩展程序页面. 3、开启页面右上角的 “开发者模式”. 4、点击 “加载已解压的扩展程序” 按钮&#xff0c;选择之前解压的文件夹&#xff0c;点…

[数据集][图像分类]常见鱼类分类数据集2w张8类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;7554&#xff08;剩余1w多为测试集&#xff09; 分类类别数&#xff1a;…

uniapp开发小程序内嵌h5页面,video视频两边有细小黑色边框

1.问题如图 2.原因分析 是否为设置上述属性呢&#xff1f; 设置了&#xff0c;但是仍然有黑边。经过选中页面元素分析后&#xff0c;判断video元素本身就有这种特点&#xff0c;就是视频资源无法完全铺满元素容器。 3.解决方案

【SpringMVC】SpringMVC 快速入门

通常&#xff0c;Web 应用的工作流程如下&#xff1a; 用户通过浏览器访问前端页面&#xff1b; 前端页面通过异步请求向后端服务器发送数据&#xff1b; 后端采用“表现层-业务层-数据层”三层架构进行开发&#xff1a; 表现层接收页面请求将请求参数传递给业务层业务层访问…

OpenGL变换矩阵和输入控制

在前面的文章当中我们已经成功播放了动画&#xff0c;让我们的角色动了起来&#xff0c;这一切变得比较有意思了起来。不过我们发现&#xff0c;角色虽然说是动了起来&#xff0c;不过只是在不停地原地踏步而已&#xff0c;而且我们也没有办法通过键盘来控制这个角色来进行移动…

【Spring MVC 核心机制】核心组件和工作流程解析

在 Web 应用开发中&#xff0c;处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架&#xff0c;将这些复杂的操作高度抽象化&#xff0c;通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…

Verilog 过程赋值

关键词&#xff1a;阻塞赋值&#xff0c;非阻塞赋值&#xff0c;并行 过程性赋值是在 initial 或 always 语句块里的赋值&#xff0c;赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后&#xff0c;其值将保持不变&#xff0c;直到重新被赋予新值。 连续性赋值总是处…

[并发与并行] python如何构建并发管道处理多阶段任务?

文章目录 1. 背景&目标2. show me the code3.知识点4. 总结 1. 背景&目标 背景&#xff1a;一个任务可分为多个阶段(各个阶段非CPU密集型任务&#xff0c;而是属于IO密集型任务)&#xff0c;希望每个阶段能够交给各自的线程去执行。 目标&#xff1a;构建支持多并发的…

07 基于OpenAMP的核间通信方案

引言 ZYNQ7020有两个CPU核心&#xff0c;这两个核心可以采用SMP或AMP方式进行调度&#xff0c;当采用AMP方式进行调度时核0和核1可以运行不同的操作系统&#xff0c;如核0运行Linux系统&#xff0c;提供有些复杂的用户交互工作&#xff0c;核1运行实时操作系统&#xff0c;对设…

7.若依参数设置、通知公告、日志管理

参数设置 对系统中的参数进行动态维护。 关闭验证码校验功能 打开页面注册功能 需要修改前端页面代码 通知公告 促进组织内部信息传递 若依只提供了一个半成品&#xff0c;只实现了管理员可以添加通知公告。 日志管理 追踪用户行为和系统运行状况。 登录日志 和操作日志…

基于Docker+模拟器的Appium自动化测试(二)

模拟器的设置 打开“夜神模拟器”的系统设置&#xff0c;切换到“手机与网络”页&#xff0c;选中网络设置下的“开启网络连接”和“开启网络桥接模式”复选框&#xff0c;而后选择“静态IP”单选框&#xff0c;在IP地址中输入“192.168.0.105”&#xff0c;网关等内容不再赘述…