Oracle数据库 查看SQL执行计划的几种方法

news2024/11/21 19:29:05

前言

在日常的运维工作中,SQL优化是DBA的进阶技能,SQL优化的前提是要看SQL的执行计划是否正确,下面分享几种查看执行计划的方法,每一种方法都各有各的好处,可以根据特定场景选择某种方法。

一.使用AUTOTRACE查看执行计划

我们利用SQLPLUS中自带的AUTOTRACE工具查看执行计划。AUTOTRACE用法如下。

set autot on:			该命令会运行SQL并且显示运行结果,执行计划和统计信息。
set autot trace:		该命令会运行SQL,但不显示运行结果,会显示执行计划和统计信息。
set autot trace exp:	运行该命令查询语句不执行,DML语句会执行,只显示执行计划。
set autot trace stat:	该命令会运行 SQL,只显示统计信息。
set autot off:			关闭 AUTOTRACE。

在这里插入图片描述

-执行计划中的各个参数解释
recursive calls 			表示递归调用的次数,一个SQL第一次执行就会发生硬解析,在硬解析的时候,优化器会隐含地调用一些内部SQL,因此当一个SQL第一次执行,recursive calls会大于0,第二次执行的时候不需要递归调用,recursive calls就会等于0,如果SQL语句中有自定义函数,recursive calls永远不会等于0,自定义函数被调用了多少次,recursive calls就会显示为多少次
db block gets				表示有多少块发生变化,一般情况下只有DML语句才会导致块发生变化,所以查询语句中的db block gets一般为0
consistent gets				表示逻辑读,单位是块。在SQL优化的时候我们应该想方设法减少逻辑读的个数,通常情况下逻辑读越小,性能越好。需要注意的是,逻辑读并不是衡量SQL执行快慢的唯一标准,需要结合I/O
physical reads				表示从磁盘读取了多少个数据块,也就是物理读。如果表已经被缓存在buffer cache中,没有物理读,那么会等于0
redo size					表示产生了多少字节的重做日志,一般也是只有DML语句会产生redo,查询语句一般情况下不会产生redo
bytes sent via SQL*Net to client					表示从数据库服务器发送了多少字节到客户端
bytes received via SQL*Net from client				表示从客户端发送了多少字节到服务端
SQL*Net roundtrips to/from client					表示客户端与数据库服务端交互次数,我们可以通过设置arraysize减少交互次数
sorts (memory)				内存排序的次数
sorts (disk)				磁盘排序的次数
rows processed				表示SQL一共返回多少行数据。我们在做SQL优化的时候最关心这部分数据,因为可以根据SQL返回的行数判断整个SQL应该是走HASH连接还是走嵌套循环。如果rows processed很大,一般走HASH连接,如果rows processed很小,一般走嵌套循环。
二.使用EXPLAIN PLAN FOR查看执行计划

用法如下

explain plan for SQL语句;
select * from table(dbms_xplan.display);

-查看高级(ADVANCED)执行计划:
explain plan for SQL语句;
select * from table(dbms_xplan.display(NULL, NULL,'advanced -projection'));
三.查看带有A-TIME的执行计划
alter session set statistics_level = all;
select count(*) from test;
select * from table(dbms_xplan.display_cursor(NULL, NULL,'allstats last'));

或者在SQL语句中添加hint:/*+ gather_plan_statistics */
select /*+ gather_plan_statistics */ count(*) from test where owner='SYS';
select * from table(dbms_xplan.display_cursor(NULL, NULL,'allstats last'));

在这里插入图片描述

Starts			表示这个操作执行的次数。
E-Rows			表示优化器估算的行数,就是普通执行计划中的Rows。
A-Rows			表示真实的行数。
A-Time			表示累加的总时间。与普通执行计划不同的是,普通执行计划中的Time是假的,而A-Time是真实的。
Buffers			表示累加的逻辑读。
Reads			表示累加的物理读。
上面介绍了3种方法查看执行计划。
使用AUTOTRACE或者EXPLAIN PLAN FOR获取的执行计划来自于PLAN_TABLE。
PLAN_TABLE是一个会话级的临时表,里面的执行计划并不是SQL真实的执行计划,它只是优化器估算出来的。
真实的执行计划不应该是估算的,应该是真正执行过的。SQL执行过的执行计划存在于共享池中,具体存在于数据字典V$SQL_PLAN中。
带有A-Time的执行计划来自于V$SQL_PLAN,是真实的执行计划,而通过AUTOTRACE、通过EXPLAIN PLAN FOR获取的执行计划只是优化器估算获得的执行计划。
四.查看正在执行的SQL的执行计划

有时需要抓取正在运行的SQL的执行计划,这时我们需要获取SQL的SQL_ID以及SQ的CHILD_NUMEBR,然后将其代入下面SQL,就能获取正在运行的SQL的执行计划。

select * from table(dbms_xplan.display_cursor('sql_id',child_number));

-在一个会话中执行如下SQLselect count(*) from a,b where a.owner=b.owner;

-在另外一个会话中执行如下SQL  找出sql的sql_id和child_number
select a.sid, a.event, a.sql_id, a.sql_child_number, b.sql_text
  from v$session a, v$sql b
 where a.sql_address = b.address
   and a.sql_hash_value = b.hash_value
   and a.sql_child_number = b.child_number
 order by 1 desc;
 
-接下来我们将 SQL_ID 和 CHILD_NUMBER 代入以下SQLselect * from table(dbms_xplan.display_cursor('czr9jwxv0xra6',0));

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

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

相关文章

Hbase Shell

一、启动运行HBase 首先登陆SSH,由于之前在Hadoop的安装和使用中已经设置了无密码登录,因此这里不需要密码。然后,切换至/usr/local/hadoop,启动Hadoop,让HDFS进入运行状态,从而可以为HBase存储数据&#…

31-2 智能驾驶系统

智能驾驶功能分类 安全类功能 纵向 FCW/AEB FCTA/FCTB/RCTA/RCTB RVW/RVB 横向 ESA LSS LKA/LDW/ELK 盲区安全辅助 BSD LCA DOW CVW 舒适功能类 纵向 ACC CSA TSR ISA 横向 LCC ILC ALC 横纵向 TJA/HWA NOP 泊车功能 RAP 蓝牙通信,环视超车波 HPA 记忆泊车…

ubuntu20.04_从零LOD-3DGS的复现

环境要求 dependencies:- cudatoolkit11.6- plyfile0.8.1- python3.7.13- pip22.3.1- pytorch1.12.1- torchaudio0.12.1- torchvision0.13.1- tqdm1. 安装conda创建环境 conda create -n lod-3dgs python3.7.132. 安装CUDA11.6和相应cuDNN。 2.1 CUDA CUDA安装参考CUDA10.1…

Linux:网络协议socket

我们之前学的通信是本地进程间通信,如果我们想在网络间通信的话,就需要用到二者的ip地址,分别被称为源IP地址和目的IP地址,被存入ip数据包中,其次我们还需要遵循一些通信协议。 TCP协议:传输层协议&#x…

Leetcode - 143双周赛

目录 一,3345. 最小可整除数位乘积 I 二,3346. 执行操作后元素的最高频率 I 1.差分数组 2.同向三指针 滑动窗口 三, 3348. 最小可整除数位乘积 II 一,3345. 最小可整除数位乘积 I 本题直接暴力枚举,题目求 >n…

Springboot3 配置Swargger3.0版本

一、swagger 版本配置&#xff0c;我用的3.0.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency>二、说明&#xff1a;springdo…

error MSB3325:无法导入以下密钥文件xxx,该密钥文件可能受密码保护

错误提示信息(类似如下)&#xff1a; error MSB3325: 无法导入以下密钥文件: F:\...\Common.pfx。该密钥文件可能受密码保护。若要更正此问题&#xff0c;请尝试再次导入证书&#xff0c;或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_A65F207BE95F57D0 出现此…

喜报|超维机器人荣获昇腾AI创新大赛铜奖

近日&#xff0c;在备受瞩目的昇腾AI创新大赛中&#xff0c;超维机器人凭借扎实的技术实力和创新产品&#xff0c;荣获大赛铜奖。这一荣誉不仅展现了超维机器人在智能巡检领域的技术创新与突破&#xff0c;也标志着超维机器人的智能巡检解决方案在人工智能领域获得了广泛认可&a…

[[nodiscard]] 使用说明

1 作用 [[nodiscard]] 属性&#xff1a;这个属性可以用于函数或者返回类型。它的作用是告诉编译器&#xff1a;调用这个函数时&#xff0c;它的返回值不应被忽略。如果程序员调用了这样的函数但没有使用它的返回值&#xff0c;编译器会发出警告。这对于那些返回重要状态或错误…

golang分布式缓存项目 Day4 一致性哈希

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习 为什么使用一致性哈希 我该访问谁 对于分布式缓存来说&#xff0c;当一个节点接收到请求&#xff0c;如…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍&#xff0c;使用实例及注意事项&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…

UE5 umg学习(四) 将UI控件切换到关卡中

视频资料 7、将UI控件渲染到关卡_哔哩哔哩_bilibili 在前三节里&#xff0c;创建了用户的控件蓝图Widget_BP 目标是运行的时候&#xff0c;开始运行这个蓝图&#xff0c;因此需要在开始事件触发运行 首先&#xff0c;回到主页&#xff0c;点击关卡蓝图 要从事件开始运行时 …

React Hooks在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 引言 React Hooks …

军工行业运维:监控易引领自主可控新潮流

在军工行业&#xff0c;信息安全和技术创新始终是发展的重中之重。随着信息化建设的不断深入&#xff0c;对监控产品的要求也日益严格。 监控易作为一款高性能、全面性的运维监控解决方案&#xff0c;凭借其国产化、自主可控的特性&#xff0c;以及对军工行业特殊需求的深刻理解…

【操作系统】——调度算法

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 先来先服务&#xff08;FCFS, First Come First Serve) 短作业优先&#xff08;SJF, Shortest Job Fi…

C++入门基础知识147—【关于C++ 一元运算符重载】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 一元运算符重载的相关内容&#xff0…

【测试框架篇】单元测试框架pytest(1):环境安装和配置

一、pytest简介 Pytest是Python的一种单元测试框架&#xff0c;与Python自带的unittest测试框架类似&#xff0c;但是比 unittest框架使用起来更简洁&#xff0c;效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点&#xff1a; 非常容易…

【CANOE】【学习】【DecodeString】字节转为中文字符输出

系列文章目录 文章目录 系列文章目录前言一、DecodeString 转为中文字节输出二、代码举例1.代码Demo2.DecodeString 函数说明函数语法&#xff1a;参数说明&#xff1a;返回值&#xff1a;使用示例&#xff1a;示例代码&#xff1a; 说明&#xff1a; 前言 有时候使用的时候&a…

边缘计算在智能交通系统中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 引言 边缘计算概述 定义与原…