暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一学就会的获取SQL执行计划和性能统计信息的方法

688

出品TeacherWhat

题图:Hands@Photo by Toa Heftiba on Unsplash

关键字:Oracle、SQL、调优、诊断、手把手数据库入门、SQL*PLUSAutotrace

正文约4000字,建议阅读时间5分钟

目录结构:

1. AUTOTRACE使用方法

2. AUTOTRACE的使用例

3. AUTOTRACE报告含义解析

4. EXPLAIN PLAN使用例 

5. 注意事项

6. 本文要点&思考


本公众号文章仅代表个人观点,与任何公司无关。


其他系列文章:

SQL调优和诊断从哪入手?

获取SQL执行计划最基础的方法是啥?

AUTOTRACE

在SQL*PLUS上,可以通过AUTOTRACE来进行SQL调优和查看执行计划以及执行时候的性能统计信息。

AUTOTRACE使用方法

AUTOTRACE具体使用方法方法如下:

1.要使用AUTOTRACE命令,也需要首先创建执行计划表PLAN_TABLE(一般数据库中默认已经建好)。

@$ORACLE_HOME/rdbms/admin/utlxplan.sql

2.赋予执行用户相关权限

CONNECT  AS SYSDBA
@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL
GRANT PLUSTRACE TO <执行用户>;

3.AUTOTRACE的使用方法

SQL> set autotrace help
Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

AUTOTRACE命令详细语法

※关于AUTOTRACE命令的更详细语法可以参考在线文档:

▲SQL*Plus® User’s Guide and Reference

Controlling the Autotrace Report
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqpug/tuning-SQL-Plus.html#GUID-C8FBE008-B2D6-4049-A095-0747E5328A50

序号命令解释
1SET AUTOTRACE ON打开Autotrace,输出SQL查询结果和执行计划,以及性能统计
2SET AUTOTRACE ON EXPLAIN打开Autotrace,输出SQL查询结果和执行计划,但不输出性能统计
3SETAUTOTRACE TRACEONLY打开Autotrace,输出执行计划和性能统计,但不输出SQL查询结果
4SET AUTOTRACE TRACEONLY STATISTICS打开Autotrace,仅输出性能统计,但不输出SQL查询结果和执行计划
5SET AUTOTRACE OFF此为默认值,即关闭Autotrace

AUTOTRACE的使用例

下面通过AUTOTRACE查看执行计划的例子。

例1(11.2.0.4):set autotrace on

SQL> set autotrace on
SQL> select * from dual;

D
-
X

Execution Plan
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
538 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


例2:set autotrace traceonly explain

SQL> set autotrace traceonly explain
SQL> select * from dual;

Execution Plan
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------

AUTOTRACE报告含义解析

以如下的输出报告为例,介绍一下各部分含义。

输出例:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> set autotrace on
SQL> select * from dual;

DU -----①
--
X


执行计划
----------------------------------------------------------
Plan hash value: 272002086 -----②

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -----③
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------


统计信息 -----④
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
554 bytes sent via SQL*Net to client
380 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed



报告各部分含义

①:SQL语句的执行结果

②:SQL执行计划的哈希值,用于标识不同的执行计划

③:SQL的执行计划内容

项目解释
Id各步骤的序号,注:非执行顺序
Operation操作内容
Name操作对象
Rows操作行数
Bytes操作bytes大小(预估)
Cost (%CPU)当前操作成本估算
Time当前操作需要时间估算

④:SQL的执行性能统计

序号数据库统计名称说明
1recursive calls递归调用SQL的数量;执行SQL语句时生成的内部SQL语句,称为递归调用。
2db block gets以当前模式读取(CURRENT)的数据块数。即读取最新的块内容,通常在数据修改时发生。
3consistent gets一致性读的数据块数。可能包含数据块(data)的读取和回滚数据块(undo)的读取。
4physical reads物理读的数据块数。包括磁盘 "physical reads direct"和从磁盘读入缓存的数据块.
5redo size生成的redo的大小(单位:bytes)
6bytes sent via SQL*Net to client前台进程发送到客户端的字节总数。
7bytes received via SQL*Net from client从客户端收到的字节总数。
8SQL*Net roundtrips to/from client发送到客户端和从客户端接收的Oracle Net消息总数
9sorts (memory)不需要写入磁盘,在内存中完成的排序操作数
10sorts (disk)至少需要写入一次磁盘的排序操作数
11rows processed操作中处理的行数

注意点

  1. 当指定参数TRACEONLY时:

    SQL语句会真正执行;
    不会显示执行结果;
    只会显示统计信息和执行计划

  2. 当指定参数TRACEONLY EXPLAIN时:

    SQL语句不会真正执行;
    不会显示执行结果;
    只会显示执行计划,不会显示统计信息。

相关问题

SP2-0613: PLAN_TABLE错误

如果执行计划表PLAN_TABLE不存在的话,执行set autotrace可能会发生SP2-0613: PLAN_TABLE错误。
解决:用执行set autotrace的用户执行下面操作。

$ORACLE_HOME/rdbms/admin/utlxplan.sql

本文要点

本文介绍了在SQL*PLUS上查看执行计划以及执行时候的性能统计信息方法,AUTOTRACE命令。

思考

AUTOTRACE命令和EXPLAIN PLAN命令有什么相似之处和不同之处?


——End——


专注于技术不限于技术!

用碎片化的时间,一点一滴地提高数据库技术和个人能力。

欢迎关注!



获取SQL执行计划最基础的方法是啥?


SQL调优和诊断从哪入手?


2020年11月 数据库流行度排名


你知道Oracle数据库除了SGA和PGA,还有MGA么?


读了这些数据库经典书,你已经超过了90%的Oracle技术者(文末彩蛋)


手把手教你在Windows 10安装Oracle 19c(详细图文附踩坑指南)



文章转载自SQL和数据库技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论