AWR报告分析之TOP SQL

2022-08-22 13:44:04 浏览数 (1)

编者按:

本文作者系Walt,关注SQL开发,Oracle、MySQL、PostgreSQL、TiDB等数据库,AWS、Azure、OCI等公有云计算架构和技术。

个人主页: https://blog.csdn.net/lukeUnique。

SQL专栏课程:https://www.modb.pro/course/125

编辑|SQL和数据库技术(ID:SQLplusDB)

在AWR报告中,有一个称为【SQL Statistics】的部分,会输出在AWS报告期间内根据各种条件进行排序的TOP SQL,各TOP SQL详细如下。 (相关内容会保存在AWR的DBA_HIST_SQLSTAT表中。)

SQL ordered by Elapsed Time

根据SQL执行时间(Elapsed Time)排序的TOP SQL。

代码语言:javascript复制
Elapsed Time(S): SQL语句执行的总时间(单位秒)。
                 注意:Elapsed Time = CPU Time   Wait Time
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
Elap per Exec(s): SQL一次执行的平均时间(单位秒)。=Elapsed Time/Executions
% Total        : SQL的Elapsed Time时间占数据库总时间的百分比。=  Elapsed time / DB Time * 100(%)
%CPU          : CPU时间和Elapsed Time时间的百分比。= CPU Time /Elapsed Time * 100(%)
%IO            : IO 时间和Elapsed Time时间的百分比。= User IO Time /Elapsed Time * 100(%)
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by CPU Time

根据SQL消耗CPU时间排序的TOP SQL。

代码语言:javascript复制
CPU Time (s):SQL语句执行消耗的CPU总时间(单位秒)。
                    当CPU Time和Elapsed Time相近时,表示时间主要消耗在CPU上。
                    当CPU Time和Elapsed Time差值较大时,表示时间大量消耗在等待上,这是我们要关注等待事件。
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
CPU per Exec (s):SQL一次执行的平均CPU时间(单位秒)。=CPU Time /Executions
% Total        : SQL的CPU Time 时间占数据库总CPU 时间的百分比。
Elapsed Time(S): SQL语句执行的总时间(单位秒)。
%CPU          : CPU时间和Elapsed Time时间的百分比。= CPU Time /Elapsed Time * 100(%)
%IO            : IO 时间和Elapsed Time时间的百分比。= User IO Time /Elapsed Time * 100(%)
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by User I/O Wait Time

根据SQL消耗I/O等待时间排序的TOP SQL。

代码语言:javascript复制
User I/O Time (s):SQL语句执行消耗的I/O总时间(单位秒)。
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
UIO per Exec (s):SQL一次执行的平均I/O时间(单位秒)。=User I/O Time /Executions
% Total        : SQL的User I/O Time时间占数据库总User I/O 时间的百分比。
Elapsed Time(S): SQL语句执行的总时间(单位秒)。
%CPU          : CPU时间和Elapsed Time时间的百分比。= CPU Time /Elapsed Time * 100(%)
%IO            : IO 时间和Elapsed Time时间的百分比。= User IO Time /Elapsed Time * 100(%)
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by Gets

根据SQL缓存读块数排序的TOP SQL

代码语言:javascript复制
Buffer Gets   :SQL访问的缓存数据块数(逻辑IO)
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
Gets per Exec:SQL一次执行的平均访问的缓存数据块数。=Buffer Gets /Executions
% Total        : SQL的Buffer Gets  占总Buffer Gets 的百分比。
Elapsed Time(S): SQL语句执行的总时间(单位秒)。
%CPU          : CPU时间和Elapsed Time时间的百分比。= CPU Time /Elapsed Time * 100(%)
%IO            : IO 时间和Elapsed Time时间的百分比。= User IO Time /Elapsed Time * 100(%)
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by Reads

根据SQL物理读块数排序的TOP SQL。

代码语言:javascript复制
Physical Reads  :SQL物理读的数据块数(物理IO)
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
Reads per Exec:SQL一次执行的物理读数据块数。=Physical Reads/Executions
% Total        : SQL的Physical Reads占总Physical Reads的百分比。
Elapsed Time(S): SQL语句执行的总时间(单位秒)。
%CPU          : CPU时间和Elapsed Time时间的百分比。= CPU Time /Elapsed Time * 100(%)
%IO            : IO 时间和Elapsed Time时间的百分比。= User IO Time /Elapsed Time * 100(%)
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by Physical Reads (UnOptimized)

根据SQL非优化的物理读次数排序的TOP SQL。

我们可以看到AWR报告中第一行的内容UnOptimized Read Reqs = Physical Read Reqs - (Optimized Read Reqs - Cell Flash Cache Read Hits for Controlfile)。 所谓的非优化的物理读(Optimized Read Reqs)是通过Database Smart Flash Cache 或者Exadata Smart Flash Cache功能进行的物理读。

智能闪存( Smart Flash Cache)功能主要是将SSD硬盘当做内存(Buffer cache)使用的功能,用于减少I/O。通过这个当内存不足的时候,设定的Smart Flash Cache可以当做二级缓存用于缓存数据块。

要使用这个智能闪存功能需要设置如下参数:

代码语言:javascript复制
db_flash_cache_file :智能闪存的位置
db_flash_cache_size :智能闪存的大小

另外,当未启用智能闪存(Database Smart Flash Cache)时,我们可以认为所有的物理读都是非优化的。

代码语言:javascript复制
UnOptimized Read Reqs :SQL非优化的物理读的次数
Physical Read Reqs  :SQL物理读的次数
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
UnOptimized Reqs per Exec:SQL一次执行的非优化的物理读次数。=UnOptimized Read Reqs/Executions
%Opt        : 优化的物理读次数和物理读总次数的百分比。
% Total        : 非优化的物理读的次数占总P非优化的物理读的次数的百分比。
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by Executions

根据SQL执行次数排序的TOP SQL。

代码语言:javascript复制
Executions      : SQL执行总次数。
Rows Processed:SQL处理的总行数。
Rows per Exec :SQL一次执行的平均处理行数。=Rows Processed /Executions
Elapsed Time(S): SQL语句执行的总时间(单位秒)。
%CPU          : CPU时间和Elapsed Time时间的百分比。= CPU Time /Elapsed Time * 100(%)
%IO            : IO 时间和Elapsed Time时间的百分比。= User IO Time /Elapsed Time * 100(%)
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by Parse Calls

根据SQL解析次数排序的TOP SQL。

代码语言:javascript复制
Parse Calls     :SQL的解析次数。如果Parse Calls接近 Executions 表示SQL每次执行都需要解析,考虑游标共享。
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
% Total Parses:SQL的解析次数占总解析次数的百分比。
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

SQL ordered by Sharable Memory

根据SQL使用的共享内存排序的TOP SQL。

代码语言:javascript复制
Sharable Mem (b) :SQL占用的内存大小(单位byte)。
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
% Total       :SQL的占用的内存占总内存的百分比。
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。
代码语言:javascript复制
当发生大量内存使用导致内存不足、ORA-4031等错误时,可以关注这部分的SQL。

SQL ordered by Version Count

根据SQL版本(version count)排序的TOP SQL。

代码语言:javascript复制
version count :同一个父游标下子游标的数量。
Executions      : SQL执行总次数,如果Executions =0表示在awr报告时间内未执行完。
SQL ID         : SQL语句的唯一标识。
SQL Module : 调用SQL的程序模块。
SQL Text     :SQL 文本内容的一部分,完整内容需要查看【Complete List of SQL Text】。

Version Count主要用于描述同一个父游标下子游标的数量。

对于一条SQL语句而言,会同时存在一个父游标和至少一个子游标。父游标主要依赖于SQL文本内容(必须完全一致,即空格、大小写、注释等不同都会被认为是不同的SQL),不同用户会话的执行SQL语句只要文本内容相同的,就会共享同一个父游标。对于子游标而言,即使执行相同的SQL语句,也可能因为执行用户的不同,或者访问的对象有所不同而不同。另外,由于优化器设置、绑定变量值等情况,也可能导致同一个SQL存在多个子游标。

0 人点赞