Oracle 执行计划查看方法汇总及优劣对比
在 Oracle 数据库中,查看执行计划是优化 SQL 语句性能的重要工具。以下是几种常用的查看执行计划的方法及其优劣比较:
1. 使用 EXPLAIN PLAN FOR
和 DBMS_XPLAN.DISPLAY
方法
-
执行
EXPLAIN PLAN FOR
语句:EXPLAIN PLAN FOR SELECT * FROM your_table WHERE your_column = 'some_value';
-
查看执行计划:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
优点
- 简单易用:适用于大多数情况,操作简单。
- 详细信息:可以提供详细的执行计划信息,包括操作类型、成本、行数等。
缺点
- 不反映实际执行:
EXPLAIN PLAN
只是模拟执行计划,不一定反映实际执行情况。 - 需要权限:需要
EXPLAIN PLAN
权限。
2. 使用 DBMS_XPLAN.DISPLAY_CURSOR
方法
-
执行 SQL 语句:
SELECT * FROM your_table WHERE your_column = 'some_value';
-
查看执行计划:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
优点
- 反映实际执行:查看的是实际执行的计划,更能反映真实的性能情况。
- 详细统计信息:可以提供实际的执行统计信息,如 I/O 次数、CPU 时间等。
缺点
- 需要执行 SQL:必须先执行 SQL 语句,才能查看执行计划。
- 依赖共享池:只能查看在共享池中的 SQL 语句的执行计划。
3. 使用 AUTOTRACE
(仅限 SQL*Plus)
方法
-
启用 AUTOTRACE:
SET AUTOTRACE ON EXPLAIN;
-
执行 SQL 语句:
SELECT * FROM your_table WHERE your_column = 'some_value';
-
禁用 AUTOTRACE:
SET AUTOTRACE OFF;
优点
- 集成在 SQL*Plus:适用于 SQL*Plus 用户,操作简便。
- 即时反馈:执行 SQL 语句时立即显示执行计划。
缺点
- 仅限 SQL*Plus:只能在 SQL*Plus 中使用。
- 功能有限:不如
DBMS_XPLAN.DISPLAY
提供的信息详细。
4. 使用 V$SQL_PLAN
视图
方法
-
找到 SQL 语句的 SQL_ID:
SELECT sql_id, sql_text FROM v$sql WHERE sql_text LIKE '%your_sql_statement%';
-
查询执行计划:
SELECT * FROM v$sql_plan WHERE sql_id = 'your_sql_id';
优点
- 灵活性高:可以直接查询视图,灵活度高。
- 实时信息:可以查看当前正在执行的 SQL 语句的执行计划。
缺点
- 复杂性:需要手动查询视图,操作相对复杂。
- 信息冗余:返回的信息较多,需要筛选有用的部分。
5. 使用 Oracle Enterprise Manager (OEM)
方法
- 登录 OEM。
- 导航到 SQL 性能页面。
- 输入 SQL 语句并查看执行计划。
优点
- 图形界面:提供图形化的用户界面,易于理解和操作。
- 综合信息:可以查看多种性能指标,不仅仅是执行计划。
缺点
- 需要 OEM:需要安装和配置 Oracle Enterprise Manager。
- 资源消耗:图形界面可能消耗更多系统资源。
6. 使用 DBMS_XPLAN.DISPLAY_AWR
方法
-
找到 SQL 语句的 SQL_ID 和 PLAN_HASH_VALUE:
SELECT sql_id, plan_hash_value FROM dba_hist_sqlstat WHERE sql_text LIKE '%your_sql_statement%';
-
查询执行计划:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('your_sql_id', 'your_plan_hash_value'));
优点
- 历史信息:可以查看 AWR 中的历史执行计划,有助于长期性能分析。
- 详细统计:提供详细的执行统计信息。
缺点
- 需要 AWR:需要 AWR 功能开启,且需要相应的权限。
- 复杂性:操作相对复杂,需要查找 SQL_ID 和 PLAN_HASH_VALUE。
7. 使用事件 10046 跟踪
方法
-
启用事件 10046 跟踪:
-
对于当前会话:
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
-
对于特定的会话(假设 SID 为 123,SERIAL# 为 456):
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(123, 456, TRUE);
-
-
执行 SQL 语句:
SELECT * FROM your_table WHERE your_column = 'some_value';
-
禁用事件 10046 跟踪:
-
对于当前会话:
ALTER SESSION SET EVENTS '10046 trace name context off';
-
对于特定的会话(假设 SID 为 123,SERIAL# 为 456):
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(123, 456, FALSE);
-
-
查看跟踪文件:
-
查找跟踪文件的位置,通常在
user_dump_dest
参数指定的目录下。
SHOW PARAMETER user_dump_dest
-
使用
tkprof
工具格式化跟踪文件:
tkprof trace_file.trc output_file.txt explain=your_username/your_password
-
查看生成的
output_file.txt
文件,其中包含详细的执行计划和性能信息。
-
优点
- 详细信息:提供详细的执行计划、执行时间和等待事件等信息,有助于深入分析性能问题。
- 灵活性:可以针对特定的会话或当前会话启用跟踪。
- 历史信息:可以保留长时间的跟踪信息,便于后续分析。
缺点
- 性能开销:启用跟踪会增加系统开销,特别是在高负载情况下。
- 复杂性:操作相对复杂,需要手动启用和禁用跟踪,以及使用
tkprof
格式化跟踪文件。 - 文件管理:需要管理和清理生成的跟踪文件,以免占用过多磁盘空间。
8. 使用 STATISTICS_LEVEL=ALL
方法
-
设置统计级别为 ALL:
ALTER SESSION SET STATISTICS_LEVEL=ALL;
-
执行 SQL 语句:
SELECT * FROM your_table WHERE your_column = 'some_value';
-
查看执行计划和统计信息:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
优点
- 详细统计信息:可以提供详细的执行计划和统计信息,包括 I/O 次数、CPU 时间等。
- 反映实际执行:查看的是实际执行的计划,更能反映真实的性能情况。
- 操作简单:只需设置统计级别并执行 SQL 语句即可。
缺点
- 性能开销:设置
STATISTICS_LEVEL
为ALL
会增加执行 SQL 语句的性能开销。 - 临时设置:仅对当前会话有效,需要在每个会话中手动设置。
总结
方法 | 优点 | 缺点 |
---|---|---|
EXPLAIN PLAN FOR + DBMS_XPLAN.DISPLAY | 简单易用,详细信息 | 不反映实际执行,需要权限 |
DBMS_XPLAN.DISPLAY_CURSOR | 反映实际执行,详细统计信息 | 需要执行 SQL,依赖共享池 |
AUTOTRACE | 集成在 SQL*Plus,即时反馈 | 仅限 SQL*Plus,功能有限 |
V$SQL_PLAN | 灵活性高,实时信息 | 复杂性高,信息冗余 |
Oracle Enterprise Manager (OEM) | 图形界面,综合信息 | 需要 OEM,资源消耗 |
DBMS_XPLAN.DISPLAY_AWR | 历史信息,详细统计 | 需要 AWR,复杂性 |
事件 10046 跟踪 | 详细信息,灵活性高,历史信息 | 性能开销,复杂性,文件管理 |
ALTER SESSION SET STATISTICS_LEVEL=ALL | 详细统计信息,反映实际执行,操作简单 | 性能开销,临时设置 |
适用场景
EXPLAIN PLAN FOR
+DBMS_XPLAN.DISPLAY
:适用于简单的查询优化,快速查看执行计划。DBMS_XPLAN.DISPLAY_CURSOR
:适用于已经执行的 SQL 语句,需要查看实际执行情况。AUTOTRACE
:适用于 SQL*Plus 用户,需要快速反馈。V$SQL_PLAN
:适用于需要灵活查询执行计划的场景。- Oracle Enterprise Manager (OEM):适用于需要图形化界面和综合性能信息的场景。
DBMS_XPLAN.DISPLAY_AWR
:适用于需要查看历史执行计划的场景。- 事件 10046 跟踪:适用于需要深入分析性能问题,特别是涉及执行时间和等待事件的场景。
STATISTICS_LEVEL=ALL
:适用于需要详细统计信息和反映实际执行情况的场景,操作简单但有性能开销。
希望这些方法和优劣比较对你有所帮助!
相关文章:

Oracle 执行计划查看方法汇总及优劣对比
在 Oracle 数据库中,查看执行计划是优化 SQL 语句性能的重要工具。以下是几种常用的查看执行计划的方法及其优劣比较: 1. 使用 EXPLAIN PLAN FOR 和 DBMS_XPLAN.DISPLAY 方法 执行 EXPLAIN PLAN FOR 语句: EXPLAIN PLAN FOR SELECT * FROM …...

TCL大数据面试题及参考答案
Mysql 索引失效的场景 对索引列进行运算或使用函数:当在索引列上进行数学运算、函数操作等,索引可能失效。例如,在存储年龄的列上建立了索引,若查询语句是 “SELECT * FROM table WHERE age + 1 = 20”,这里对索引列 age 进行了加法运算,数据库会放弃使用索引而进行全表扫…...

九、FOC原理详解
1、FOC简介 FOC(field-oriented control)为磁场定向控制,又称为矢量控制(vectorcontrol),是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最佳选择…...

vue页面成绩案例(for渲染表格/删除/添加/统计总分/平均分/不及格显红色/输入内容去首尾空格trim/输入内容转数字number)
1.使用v-if 和v-else 完成<tbody>标签的条件渲染 2.v-for完成列表渲染 3.:class完成分数标红的条件控制 删哪个就传哪个的id,基于这个id去过滤掉相同id的项,把剩下的项返回 a标签的默认点击事件会跳转 这里要禁止默认事件 即使用click.provent 就…...

STM32编程小工具FlyMcu和STLINK Utility 《通俗易懂》破解
FlyMcu FlyMcu 模拟仿真软件是一款用于 STM32 芯片 ISP 串口烧录程序的专用工具,免费,且较为非常容易下手,好用便捷。 注意:STM32 芯片的 ISP 下载,只能使用串口1(USART1),对应的串口…...

Centos使用docker搭建Graylog日志平台
日志管理系统有很多,比如ELK,Graylog,LokiGrafanaPromtail 适用场景: 1.如果需求复杂,服务器资源不受限制,推荐使用ELK(Logstash Elasticsearch Kibana)方案; 2.如果需求仅是将…...

自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...

【SQL】【数据库】语句翻译例题
SQL自然语言到SQL翻译知识点 以下是将自然语言转化为SQL语句的所有相关知识点,分门别类详细列出,并结合技巧说明。 1. 数据库操作 创建数据库 自然语言:创建一个名为“TestDB”的数据库。 CREATE DATABASE TestDB;技巧:识别**“创…...

linux基本命令2
7. 文件查找和搜索 (继续) find — 查找文件 find /path/to/search -name "file_name" # 根据名称查找文件 find /path/to/search -type f # 查找所有普通文件 find /path/to/search -type d # 查找所有目录 find /path/to/search -name "*.txt" # 查找…...

Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
Redisson 是一个高性能的 Java Redis 客户端,提供了丰富的分布式工具集,如分布式锁、Map、Queue 等,帮助开发者简化 Redis 的操作。在集成 Redisson 到项目时,开发者通常有两种选择: 使用 Redisson 原始依赖。使用 Re…...

Git命令使用与原理详解
1.仓库 # 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 $ git init [project-name] # 下载一个项目和它的整个代码历史 $ git clone [url]2.配置 # 显示当前的Git配置 $ git config --list # 编辑Git配置文件 $ git co…...

Linux:自定义Shell
本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…...

vue项目中中怎么获取环境变量
在 Vue 项目中,有几种获取环境变量的方法。最常用的是通过 import.meta.env 来访问。 1.首先在项目根目录创建环境变量文件: .env # 所有环境都会加载 .env.development # 开发环境 .env.production # 生产环境2.在环境变量文件…...

C#里怎么样使用正则表达式?
C#里怎么样使用正则表达式? 正则表达式是由普通字符(如英文字母)以及特殊字符(也称为元字符)组成的一种文字模式 这种文字模式可用于检查字符串的值是否满足一定的规则,例如: 验证输入的邮箱是否合法 输入的身份证号码是否合法 输入的用户名是否满足条件等 也可以…...

《生成式 AI》课程 第5講:訓練不了人工智慧?你可以訓練你自己 (下)
资料来自李宏毅老师《生成式 AI》课程,如有侵权请通知下线 Introduction to Generative AI 2024 Springhttps://speech.ee.ntu.edu.tw/~hylee/genai/2024-spring.php 摘要 这一系列的作业是为 2024 年春季的《生成式 AI》课程设计的,共包含十个作业。…...

Vue 动态给 data 添加新属性深度解析:问题、原理与解决方案
在 Vue 中,动态地向 data 中添加新的属性是一个常见的需求,但它也可能引发一些问题,尤其是关于 响应式更新 和 数据绑定 的问题。Vue 的响应式系统通过 getter 和 setter 来追踪和更新数据,但 动态添加新属性 时,Vue 并不会自动为这些新属性创建响应式链接。 1. 直接向 V…...

【Pytest+Yaml+Allure】实现接口自动化测试框架
一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想,将代码与数据分离,易维护,易上手。使用yaml编写编写测试用例,利用requests库发送请求,使用pytest管理用例,allure生成…...

el-input绑定点击回车事件意外触发页面刷新
小伙伴们在项目中应该还是比较常用键盘指定按键事件的,尤其是一些筛选条件的通过点击键盘回车按键去触发搜索 例如: <el-form><el-form-item label条件title><el-input v-modelformData.searchKey keydown.entersearch></el-input…...

Golang的语言特性与鸭子类型
Golang的语言特性与鸭子类型 前言 什么是鸭子类型? Suppose you see a bird walking around in a farm yard. This bird has no label that says ‘duck’. But the bird certainly looks like a duck. Also, he goes to the pond and you notice that he swims l…...

如何在Linux系统中排查GPU上运行的程序
如何在Linux系统中排查GPU上运行的程序 在Linux系统中,随着深度学习和高性能计算的普及,GPU资源的管理和监控变得越来越重要。当您遇到GPU资源不足或性能下降的问题时,需要能够快速定位并解决这些问题。本文将介绍几种常用的方法来帮助您排查…...

VSCode 新建 Python 包/模块 Pylance 无法解析
问题描述: 利用 VSCode 写代码,在项目里新建一个 Python 包或者模块,然后在其他文件里正常导入这个包或者模块时出现: Import “xxxx” could not be resolved Pylance (reportMissingImports) 也就是说 Pylance 此时无法解析我们…...

Unet++改进44:添加MogaBlock(2024最新改进模块)|在纯基于卷积神经网络的模型中进行判别视觉表示学习,具有良好的复杂性和性能权衡。
本文内容:添加MogaBlock 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 通过将内核尽可能全局化,现代卷积神经网络在计算机视觉任务中显示出巨大的潜力。然而,最近在深度神经网络(dnn)内的多阶博弈论相互作用方面的进展揭示了现代卷积神经网络的表示瓶…...

计算机网络(14)ip地址超详解
先看图: 注意看第三列蓝色标注的点不会改变,A类地址第一个比特只会是0,B类是10,C类是110,D类是1110,E类是1111. IPv4地址根据其用途和网络规模的不同,分为五个主要类别(A、B、C、D、…...

【C语言】野指针问题详解及防范方法
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯什么是野指针?💯未初始化的指针代码示例问题分析解决方法 💯指针越界访问代码示例问题分析解决方法 💯指向已释放内存的…...

【SVN和GIT】版本控制系统详细下载使用教程
文章目录 ** 参考文章一、什么是SVN和GIT二、软件使用介绍1 SVN安装1.1 服务端SVN下载地址1.2 客户端SVN下载地址2 SVN使用2.1 服务端SVN基础使用2.1.1 创建存储库和用户成员2.1.2 为存储库添加访问人员2.2 客户端SVN基础使用2.2.1 在本地下载库中的内容2.2.2 版本文件操作--更…...

【Vue】Vue3.0(二十六)Vue3.0中的作用域插槽
上篇文章 【Vue】Vue3.0(二十五)Vue3.0中的具名插槽 的概念和使用场景 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年11月20日17点30分 文章目录 概念使用场景示…...
神经网络(系统性学习二):单层神经网络(感知机)
此前篇章: 神经网络中常用的激活函数 神经网络(系统性学习一):入门篇 单层神经网络(又叫感知机) 单层网络是最简单的全连接神经网络,它仅有输入层和输出层,没有隐藏层。即&#x…...

CTF之密码学(BF与Ook)
BrainFuck(通常也被称为Brainfuck或BF)和Ook是两种非常特殊且有趣的编程语言。以下是对这两种语言的详细介绍: 一、BrainFuck 简介: BrainFuck是一种极小化的计算机语言,由Urban Mller在1993年创建。由于“fuck”在英…...

【TEST】Apache JMeter + Influxdb + Grafana
介绍 使用Jmeter发起测试,测试结果存入Influxdb,Grafana展示你的测试结果。 环境 windows 10docker desktopJDK17 安装 Apache JMeter 访问官网(Apache JMeter - Apache JMeter™)下载JMeter(目前最新版本5.6.3&a…...

SpringBoot集成多个rabbitmq
1、pom文件 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><versio…...