#Oracle  #执行计划  #EXPLAIN PLAN

一、引言

在Oracle数据库性能优化中,​执行计划(Execution Plan)​是理解SQL语句如何被数据库处理的关键工具。EXPLAIN PLAN是Oracle提供的一种静态分析SQL执行路径的方法,它通过生成逻辑执行计划帮助开发者和DBA预测SQL的性能表现,而无需实际执行SQL语句。本文将深入探讨EXPLAIN PLAN的原理、使用场景、操作步骤及最佳实践,并结合DBA_OBJECTS表提供完整案例。

二、EXPLAIN PLAN 的核心原理

  • ​静态分析​:EXPLAIN PLAN不会实际执行SQL,而是将优化器生成的执行计划写入PLAN_TABLE(系统临时表)。
  • ​无副作用​:适合测试敏感操作(如DDL、DML)的执行计划,避免对生产数据产生影响。
  • ​依赖优化器统计信息​:执行计划的准确性高度依赖表和索引的统计信息(如行数、块数、直方图等)。

三、使用 EXPLAIN PLAN 的步骤

1. ​准备环境​

1.1 确认 PLAN_TABLE 存在

默认情况下,Oracle会通过脚本UTLXPLAN.SQL创建PLAN_TABLE。若表不存在,需以DBA身份执行:

@?/rdbms/admin/utlxplan.sql

1.2 权限要求

用户需具备以下权限:

  • SELECT ANY TABLE(访问目标表如DBA_OBJECTS)
  • CREATE SESSION(登录数据库)

2. ​基本语法

EXPLAIN PLAN FOR [SQL语句];SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

关于DBMS_XPLAN.DISPLAY包的使用,会在专题文章中详解说明。

四、实战案例

1. ​案例背景​

假设需要分析以下SQL的执行计划,查询TEST1表中所有类型为TABLE的对象:

create table test1 as select * from dba_objects;select count(1) from test1;COUNT(1)
----------86259

2. ​生成执行计划​

2.1 使用 EXPLAIN PLAN

SQL> explain plan for SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE FROM TEST1 WHERE OBJECT_TYPE = 'TABLE';Explained.-- 查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'BASIC'));

2.2 输出解析

示例输出:

   SQL> 
set linesize 1000
set pages 1000
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'ALL'));PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4122059633---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |  2013 |   176K|   336   (1)| 00:00:05 |
|*  1 |  TABLE ACCESS FULL| TEST1 |  2013 |   176K|   336   (1)| 00:00:05 |
---------------------------------------------------------------------------Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------1 - SEL$1 / TEST1@SEL$1Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("OBJECT_TYPE"='TABLE')Column Projection Information (identified by operation id):
-----------------------------------------------------------1 - "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22],"OBJECT_TYPE"[VARCHAR2,19]Note
------ dynamic sampling used for this statement (level=2)28 rows selected.

​关键字段说明​:

  • ​Id​:步骤编号,根节点为0。
  • ​Operation​:操作类型(如全表扫描TABLE ACCESS FULL)。
  • ​Name​:涉及的索引或表名
  • Rows​:优化器估算的返回行数。
  • ​Cost​:总成本。

五、关于explian plan底层原理

在Oracle 10g及更高版本中,当对目标SQL执行explain plan命令时 ,Oracle会把解析该SQL所生成执行计划的具体执行步骤,写入PLAN_TABLE$表。PLAN_TABLE$是一个提交时保留行的全局临时表(ON COMMIT PRESERVE ROWS GLOBAL TEMPORARY TABLE)。这就使得各个会话(Session)只能看到自己执行SQL产生的执行计划,而且不同会话往PLAN_TABLE$写入执行计划的操作互不干扰。后续执行select * from table(dbms_xplan.display) ,只是将PLAN_TABLE$的执行步骤以格式化形式展示出来。

1、PLAN_TABLE$

查看表定义

SQL> set long 90000
set heading off
set serveroutput on size 1000000
select dbms_metadata.get_ddl('TABLE', 'PLAN_TABLE$', 'SYS') from dual;CREATE GLOBAL TEMPORARY TABLE "SYS"."PLAN_TABLE$"(    "STATEMENT_ID" VARCHAR2(30),"PLAN_ID" NUMBER,"TIMESTAMP" DATE,"REMARKS" VARCHAR2(4000),"OPERATION" VARCHAR2(30),"OPTIONS" VARCHAR2(255),"OBJECT_NODE" VARCHAR2(128),"OBJECT_OWNER" VARCHAR2(30),"OBJECT_NAME" VARCHAR2(30),"OBJECT_ALIAS" VARCHAR2(65),"OBJECT_INSTANCE" NUMBER(*,0),"OBJECT_TYPE" VARCHAR2(30),"OPTIMIZER" VARCHAR2(255),"SEARCH_COLUMNS" NUMBER,"ID" NUMBER(*,0),"PARENT_ID" NUMBER(*,0),"DEPTH" NUMBER(*,0),"POSITION" NUMBER(*,0),"COST" NUMBER(*,0),"CARDINALITY" NUMBER(*,0),"BYTES" NUMBER(*,0),"OTHER_TAG" VARCHAR2(255),"PARTITION_START" VARCHAR2(255),"PARTITION_STOP" VARCHAR2(255),"PARTITION_ID" NUMBER(*,0),"OTHER" LONG,"OTHER_XML" CLOB,"DISTRIBUTION" VARCHAR2(30),"CPU_COST" NUMBER(*,0),"IO_COST" NUMBER(*,0),"TEMP_SPACE" NUMBER(*,0),"ACCESS_PREDICATES" VARCHAR2(4000),"FILTER_PREDICATES" VARCHAR2(4000),"PROJECTION" VARCHAR2(4000),"TIME" NUMBER(*,0),"QBLOCK_NAME" VARCHAR2(30)) ON COMMIT PRESERVE ROWS

2、测试explain plan与PLAN_TABLE$

2.1 使用explain plan对目标SQL解析

SQL>
select sid from v$mystat where rownum<2;SID
----------23explain plan for SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE FROM TEST1 WHERE OBJECT_TYPE = 'TABLE';Explained.

2.2 查看PLAN_TABLE$信息

SQL>
set linesize 1000
col OPERATION for a20
col OPTIONS for a20
col OBJECT_NAME for a20
select operation,options,object_name,id,cardinality,cost from sys.plan_table$;OPERATION            OPTIONS              OBJECT_NAME                  ID CARDINALITY       COST
-------------------- -------------------- -------------------- ---------- ----------- ----------
SELECT STATEMENT                                                        0        2013        336
TABLE ACCESS         FULL                 TEST1                         1        2013        336

2.3 查看session、事务和对象关系

  • 当前session产生的事务
SQL> select saddr from v$session where sid=23;SADDR
----------------
00000000924403A0select count(1) from v$transaction where SES_ADDR='00000000924403A0';COUNT(1)
----------1
  • 查看产生事务的对象
 select object_id from v$locked_object where session_id=23;OBJECT_ID
----------5187select owner,object_name from dba_objects where object_id=5187;OWNER                          OBJECT_NAME
------------------------------ --------------------
SYS                            PLAN_TABLE$
  • 对比其它事务
SQL> select sid from v$mystat where rownum<2;SID
----------35SQL> SQL> select count(1) from sys.plan_table$;COUNT(1)
----------0

其它事务中没有任何执行计划相关信息。

从上面的实验可能看出:在Oracle 10g及以上版本中,explain plan命令执行后会将解析目标SQL所产生的执行计划具体步骤写入 PLAN_TABLE$表,而 select * from table(dbms_xplan.display) 则是从 PLAN_TABLE$ 表中以格式化方式展示这些执行步骤,帮助用户了解SQL执行计划,以便优化SQL。

五、EXPLAIN PLAN 的优缺点

1. ​优点​

  • ​零风险​:不执行SQL,避免对生产环境造成影响。
  • ​轻量级​:适合快速验证复杂查询(如多表关联、子查询)的计划。
  • ​兼容性​:适用于所有Oracle版本。

2. ​缺点​

  • ​依赖统计信息​:若统计信息过期,生成的计划可能不准确。
  • ​不执行实际语句​:无法捕获运行时问题(如锁等待、死锁)。

六、总结

EXPLAIN PLAN是Oracle性能调优的基础工具,通过静态分析帮助开发者理解优化器的决策逻辑。结合DBA_OBJECTS表的案例实践,可快速掌握其核心用法。尽管它无法替代动态监控工具(如AWR、SQL Trace),但在SQL开发阶段和敏感操作测试中具有不可替代的作用。实际应用中,需结合统计信息维护和多工具交叉验证,才能全面解决性能问题。

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

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

相关文章

【论文阅读】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模态大模型 多模态大模型MultiModal Large Language Models (MM-LLMs) 的发展可以通过一篇综述了解&#xff1a;MM-LLMs: Re…

vue中computed和watch区别

在 Vue 中&#xff0c;computed 和 watch 都是用来响应式地处理数据变化的工具&#xff0c;但它们的用途和行为有明显区别。 &#x1f50d; 一句话总结 computed&#xff1a;用于声明式计算属性&#xff0c;有缓存。 watch&#xff1a;用于监听响应式数据的变化并执行副作用逻…

大语言模型:提示词决定自我反思效果: “检查回答是否错误” “验证回答是否正确”

大语言模型(LLMs)自我反思的结果很容易受提示词构造的影响 大型语言模型(LLMs)展现出令人印象深刻的零样本和少样本推理能力。有人提出,这些能力可以通过自我反思来提升,即让大型语言模型反思自己的输出,以识别和纠正初始回答中的错误。然而,尽管有一些证据表明自我反…

【iReport】实际开发中,解决iReport中打印图片不显示问题

ireport 中增加图片&#xff0c;添加上属性&#xff0c;但是运行时报错如下&#xff0c;是属性logoPath没有声明到map中 1. Parameter not found : logoPath net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not fo…

【MySQL进阶】常用MySQL程序

目录 一. mysqlcheck——表维护程序 1.1.作用 1.2 注意事项 1.3 使用方法 1.4 常用选项 1.5 mysqlcheck的特殊使用 二. mysqldump——数据库备份程序 2.1.作用 2.2 注意事项 2.3 使用方法 2.4 常用选项 三. mysqladmin——MySQL 服务器管理程序 3.1.作用 3.2 使用…

EMQX高效存储消息到MySQL指南

配置 EMQX 存储消息到 MySQL EMQX 可以通过规则引擎和数据桥接功能将消息和事件存储到 MySQL 数据库。以下是具体实现方法&#xff1a; 创建 MySQL 数据表 在 MySQL 中创建用于存储消息的表结构&#xff1a; CREATE TABLE mqtt_messages (id int(11) NOT NULL AUTO_INCREME…

springboot项目,利用docker打包部署

Windows WSL2 Docker Desktop 部署 SpringBoot 项目指南 &#xff08;没有安装docker的&#xff0c;如果是windows家庭中文版的&#xff0c;可以看我上一篇帖子&#xff1a;windows家庭版安装docker和redis-CSDN博客&#xff09; 本教程将说明如何在 Windows 系统 下&#…

MO+内核32位普冉单片机PY32F003开发板

PY32F003开发板是基于普冉半导体PY32F003微控制器设计的低成本入门级开发工具&#xff0c; PY32F003系列微控制器采用高性能的 32 位ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入高达32Kbytes flash 和 4Kbytes SRAM 存储器&#xff0c;最高工作频率 32MHz。PY32…

MySql 用存储过程删除所有用户表

用拼接语句总是会出问题 -- 1. 禁用外键约束&#xff08;防止级联删除失败&#xff09;[1]() SET SESSION FOREIGN_KEY_CHECKS 0; -- 2. 生成并执行删除语句&#xff08;替换 your_database_name&#xff09; SELECT CONCAT(DROP TABLE IF EXISTS , TABLE_NAME, ;) -- 预览语…

Java八股文——MySQL「锁篇」

讲一下MySQL里有哪些锁&#xff1f; 面试官您好&#xff0c;MySQL中的锁机制非常丰富&#xff0c;它是保证数据一致性和并发安全的核心。我通常会从锁的粒度&#xff08;加锁范围&#xff09; 和锁的模式&#xff08;功能&#xff09; 这两个维度来理解它们。 第一维度&#…

B站精品课程

【Python并发编程】线程&#xff0c;进程&#xff0c;协程&#xff0c;线程安全&#xff0c;多线程&#xff0c;死锁&#xff0c;线程池等与案例解析&#xff0c;从入门到精通 https://www.bilibili.com/video/BV1EfdcYmEff/?spm_id_from333.337.search-card.all.click&v…

# ubuntu中安装使用五笔输入法

先 清理旧输入法并重新安装 fcitx5 五笔输入法&#x1f447; &#x1f4e6; 第一步&#xff1a;清理旧的 Fcitx5 及相关输入法组件 sudo apt purge fcitx* mozc* ibus* -y sudo apt autoremove --purge -y&#x1f4dd; 说明&#xff1a; fcitx* 会清除旧版本 Fcitx/Fcitx5。…

LSM树与B+树优缺点分析

1. LSM树优化了顺序写&#xff0c;因此写性能很好&#xff0c;但在查询上&#xff1a; 需要从Level 0到Level n一直顺序查下去。极端情况是LSM树中不存在该数据&#xff0c;则需要遍历L0->Ln&#xff0c;最后返回空集。 解决方法是用布隆过滤器优化查询。 2. B树范围查询性…

【成都鱼住未来身份证】 身份证读取与解析———未来之窗行业应用跨平台架构——智能编程——仙盟创梦IDE

读取身份证开发配置 function readerid鱼住未来科技(){const webUrl http:// "127.0.0.1:30004" /api/info$.ajax({url: webUrl,type: GET,dataType: json,success: function (result) {// processContent.text(web api接口&#xff1a; webUrl 读取身份证信息…

开启并连接redis以及端口占用问题

开启命令行 redis-server.exe redis.windows.conf 端口占用问题 查看端口&#xff1a; 输入命令行&#xff1a; netstat -ano | findstr :6379 找到并停止pid号&#xff1a; 这个要用到cmd管理员身份打开 taskkill /f /pid 你的端口号 重新开启就行了 再用另一个cmd进行连…

MCP数据可视化服务器配置依赖

# requirements.txt # MCP数据可视化服务器依赖包# 核心MCP包 mcp>=0.1.0# 数据处理 pandas>=2.0.0 numpy>=1.24.0# 可视化 matplotlib>=3.7.0 seaborn>=0.12.0# 异步支持 asyncio-mqtt>=0.13.0# JSON处理 jsonschema>=4.17.0# 图像处理 Pillow>=9.5.0…

量化面试绿皮书:14. 钟表零件

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 14. 钟表零件 一个时钟(顺时针编号为 1-12)从墙上掉了下来&#xff0c;摔成三块你发现每块上的数字之和是相等的。 Q: 每块上的数字是多少&…

AndroidR平台ToastPresenter引出BinderProxy泄漏

一、问题描述 针对SA8155车机系统Qnx+Android,自动化测试模拟发送CAN信号测试,压测报出多例BinderProxy leak引起system_server重启 问题1 [CRASH] system_server osVersion: V1.2.***,提交时间:2025-06-05 ***,复现了2次java.lang.AssertionError: Binder ProxyMap has…

windows11中切换到其他桌面再切回当前桌面,任务栏的WPS有好几个窗口

感谢知乎的网友 原文链接 新建一个后缀为 .reg 的文本文件&#xff0c;将以下内容粘贴进去&#xff0c;保存&#xff0c;然后双击运行 Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\kingsoft\Office\6.0\wpsoffice\Application Settings]"enable_m…

从汇编的角度揭开C++ this指针的神秘面纱(下)

<接上篇> 我们接着来看一段C的代码&#xff1a; class A { public:int func(int j){return j _i;} private:int _i; };int main() {A a;a.func(3);return 0; } 这里定义了一个类A&#xff0c;在main函数中定义了A类的对像a。同时用a调用了成员函数func。我们来看一…