SQL调优-SQL执行性能监控

Posted 柯西极限存在准则

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL调优-SQL执行性能监控相关的知识,希望对你有一定的参考价值。

(g)v$sql_audit

全局 SQL 审计表

基于虚拟表__all_virtual_sql_audit的视图, 该虚拟表对应的数据存放在一个可配置的内存空间中

由于存放这些记录的内存是有限的,因此到达一定内存使用量,会触发淘汰

可以用来查看每次请求客户端来源,执行 server 信息,执行状态信息,等待事件及执行各阶段耗时等

是按照租户拆分的,除了系统租户,其他租户不能跨租户查询

sql_audit 相关设置

设置 sql_audit 使用开关

alter system set enable_sql_audit = true/false;

设置 sql_audit 内存上限,默认内存上限为3G,可设置范围为 [64M,+∞]

alter system set sql_audit_memory_limit = '3G';

(g)v$sql_audit看什么

retry次数是否很多(RETRY_CNT字段),如果次数很多,则可能有锁冲突或切主等情况

queue time 的值是否过大(QUEUE_TIME 字段),很高表明CPU资源不够用

获取执行计划时间(GET_PLAN_TIME), 如果时间很长,一般会伴随IS_HIT_PLAN =0,表示没有命中plan cache

查看EXECUTE_TIME值,如果值过大,则:

查看是否有很长等待事件耗时

分析逻辑读次数是否异常多(突然有大账户时可能会出现)

SQL audit记录的等待事件如下相关信息:

记录了4大类等待事件分别的耗时(APPLICATION_WAIT_TIME, CONCURRENCY_WAIT_TIME,USER_IO_WAIT_TIME,SCHEDULE_TIME),每类等待事件都涉及很多具体的等待事件

记录了耗时最多的等待事件名称(EVENT)及该等待事件耗时(WAIT_TIME_MICRO)

记录了所有等待事件发生的次数(TOTAL_WAITS)及所有等待事件总耗时(TOTAL_WAIT_TIME_MICRO)

(g)v$sql_audit淘汰机制

淘汰机制启动间隔

后台任务每隔 1s 会检测是否需要淘汰。

sql_audit 内存最大可使用上限

avail_mem_limit = min(OBServer可使用内存*10%, sql_audit_memory_limit)

淘汰/停止淘汰触发标准

序号区间淘汰触发条件停止淘汰触发条件
sql_audit 内存最大可使 用上限 (avail_mem_limit)[64M, 100M]avail_mem_limit - 20Mavail_mem_limit - 40M
[100M, 5G]availmem_limit * 0.8availmem_limit * 0.6
[5G, +∞]availmem_limit - 1Gavailmem_limit-2G
sql_audidt记录数上限/超过900w条记录达到800w条记录

SQL Trace

SQL Trace能够交互式的提供上一次执行的SQL请求执行过程信息及各阶段的耗时。

SQL Trace开关

SQL Trace功能默认时关闭的,可通过session变量来控制其关闭和打开。

set ob_enable_trace_log = 0/1;

Show Trace

当 SQL Trace功能打开后,执行需要诊断的SQL,然后通过show trace能够查看该SQL执行的信息。这些执行信息以表格方式输出,每列说明如下:

列名说明
Title记录执行过程某一个阶段点
KeyValue记录某一个阶段点产生的一些执行信息
Time记录上一个阶段点到这次阶段点执行耗时

查看各阶段耗时

 

SQL调优和性能监控利器SQL Monitor

SQL Monitor是Oracle官方提供的自动监控符合特定条件的SQL,用于收集执行时的细节信息的监控工具,常用于SQL调优和系统性能监控。

Oracle 11g中,当SQL满足以下条件之一就会被SQL Monitor捕获到,监控数据被记录在v$sql_monitor视图中,

(1) 当SQL并行执行时,会立即被实时监控到。

(2) 当SQL单进程运行时,如果消耗超过5秒的CPU或I/O时间,会监控到。

(3) 使用/*+ monitor */提示的SQL语句。

另外一个前提,就是以下两个参数的设置,

(1) statistics_level级别必须是TYPICAL或者ALL。

(2) control_management_pack_access设置为'DIAGNOSTIC+TUNING'。

SQL Monitor在Oracle企业版数据库中是免费使用的,打开SQL Monitor Report有两种形式,一个就是通过Oracle EM,中文名称是“SQL监控”,

另外一种获得SQL Monitor Report的形式就是通过dbms_sqltune包,这可能是我们经常用到的,一个原因是我们未必能使用图形界面,尤其是生产环境,端口都是禁用的,另外一个原因,就是我们能在监控脚本中调用dbms_sqltune,便于编写我们的监控逻辑。

我们尝试通过dbms_sqltune看下这个SQL Monitor Report。

(1) 确认参数

SQL> show parameter statistics_level
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICAL


SQL> show parameter control_management_pack_access;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_management_pack_access       string      DIAGNOSTIC+TUNING

(2) 确定要监控的SQL ID

其实就是确定什么样的SQL会记录到v$sql_monitor视图中,这里我们采用hint,让SQL进入v$sql_monitor,

SQL> select /*+ monitor */ type, count(*) from v$lock group by type;
TY   COUNT(*)
-- ----------
CF          1
KT          3
RD          1
KD          1
XR          1
RT          1
AE          7
TS          2
RS          1
TO          3
MR         14

可从v$sql或者v$sql_monitor找到这条SQL的ID,

SQL> select sql_id,sql_text from v$sql_monitor where sql_text like '%v$lock%';
SQL_ID                       SQL_TEXT
------------------------------------------------------------------------------
02qa4khbuqv92      select /*+ monitor */ type, count(*) from v$lock group by type

(3) dbms_sqltune

通过设置set,格式化输出,还可以选择spool,将输出打印到本地文件中,其中dbms_sqltune.report_sql_monitor可以指定报告的格式,包括'TEXT'、'HTML'、'XML' 、'ACTIVE'(只在11g R2以后才支持),

SQL> set long 1000000
SQL> set longchunksize 100000
SQL> set linesize 1000
SQL> set pagesize 0
SQL> set trim on
SQL> set trimspool on
SQL> set echo off
SQL> set feedback off
SQL> spool report_sql_monitor.txt
SQL> select dbms_sqltune.report_sql_monitor(sql_id=>'02qa4khbuqv92', type=>'TEXT', report_level=>'ALL') as report from dual;
SQL Monitoring Report


SQL Text
------------------------------
select /*+ monitor */ type, count(*) from v$lock group by type


Global Information
------------------------------
 Status              :  DONE (ALL ROWS)
 Instance ID         :  1
 Session             :  SYS (1:38345)
 SQL ID              :  02qa4khbuqv92
 SQL Execution ID    :  16777216
 Execution Started   :  02/05/2022 15:20:01
 First Refresh Time  :  02/05/2022 15:20:01
 Last Refresh Time   :  02/05/2022 15:20:01
 Duration            :  .027419s
 Module/Action       :  sqlplus@centos (TNS V1-V3)/-
 Service             :  SYS$USERS
 Program             :  sqlplus@centos (TNS V1-V3)
 Fetch Calls         :  2


Global Stats
========================================
| Elapsed |   Cpu   |  Other   | Fetch |
| Time(s) | Time(s) | Waits(s) | Calls |
========================================
|    0.03 |    0.01 |     0.02 |     2 |
========================================


SQL Plan Monitoring Details (Plan Hash Value=3191625931)
==============================================================================================================================================
| Id |         Operation          |    Name    |  Rows   | Cost |   Time    | Start  | Execs |   Rows   |  Mem  | Activity | Activity Detail |
|    |                            |            | (Estim) |      | Active(s) | Active |       | (Actual) | (Max) |   (%)    |   (# samples)   |
==============================================================================================================================================
|  0 | SELECT STATEMENT           |            |         |      |         1 |     +0 |     1 |       11 |     . |          |                 |
|  1 |   HASH GROUP BY            |            |      29 |    2 |         1 |     +0 |     1 |       11 |   1MB |          |                 |
|  2 |    HASH JOIN               |            |    5576 |    1 |         1 |     +0 |     1 |       35 |   1MB |          |                 |
|  3 |     HASH JOIN              |            |     242 |    1 |         1 |     +0 |     1 |       35 |   2MB |          |                 |
|  4 |      VIEW                  | GV$_LOCK   |     242 |    1 |         1 |     +0 |     1 |       37 |     . |          |                 |
|  5 |       UNION-ALL            |            |         |      |         1 |     +0 |     1 |       37 |     . |          |                 |
|  6 |        FILTER              |            |         |      |         1 |     +0 |     1 |       37 |     . |          |                 |
|  7 |         VIEW               | GV$_LOCK1  |     234 |    1 |         1 |     +0 |     1 |       37 |     . |          |                 |
|  8 |          UNION-ALL         |            |         |      |         1 |     +0 |     1 |       37 |     . |          |                 |
|  9 |           FIXED TABLE FULL | X$KDNSSF   |       1 |      |           |        |     1 |          |     . |          |                 |
| 10 |           FIXED TABLE FULL | X$KSQEQ    |     233 |    1 |         1 |     +0 |     1 |       37 |     . |          |                 |
| 11 |        FIXED TABLE FULL    | X$KTADM    |       1 |      |           |        |     1 |          |     . |          |                 |
| 12 |        FIXED TABLE FULL    | X$KTATRFIL |       1 |      |           |        |     1 |          |     . |          |                 |
| 13 |        FIXED TABLE FULL    | X$KTATRFSL |       1 |      |           |        |     1 |          |     . |          |                 |
| 14 |        FIXED TABLE FULL    | X$KTATL    |       1 |      |           |        |     1 |          |     . |          |                 |
| 15 |        FIXED TABLE FULL    | X$KTSTUSC  |       1 |      |           |        |     1 |          |     . |          |                 |
| 16 |        FIXED TABLE FULL    | X$KTSTUSS  |       1 |      |           |        |     1 |          |     . |          |                 |
| 17 |        FIXED TABLE FULL    | X$KTSTUSG  |       1 |      |           |        |     1 |          |     . |          |                 |
| 18 |        FIXED TABLE FULL    | X$KTCXB    |       1 |      |           |        |     1 |          |     . |          |                 |
| 19 |      FIXED TABLE FULL      | X$KSUSE    |     472 |      |         1 |     +0 |     1 |      472 |     . |          |                 |
| 20 |     FIXED TABLE FULL       | X$KSQRS    |    2304 |      |         1 |     +0 |     1 |     2304 |     . |          |                 |
==============================================================================================================================================


SQL> spool off

如果选择HTML格式的,

select dbms_sqltune.report_sql_monitor(sql_id=>'02qa4khbuqv92', type=>'HTML', report_level=>'ALL') as report from dual;

就得到了HTML的SQL Monitor Report,

结合SQL Monitor Report,我们就可以关注其中存在的一些问题,例如通常会根据最右边CPU和wait的activity,找到SQL执行计划中资源消耗较高的步骤。然后看下Oracle估算的返回行数和实际的返回行数是否相差很大,如果估算的行数和实际的行数相差不大,至少表明目前对应数据库对象上的统计信息是准确的,否则就可能存在统计信息不准的问题。还可以关注SQL的筛选条件,判断是否使用了正确的索引等优化手段。

可以说SQL Monitor是个有效采集信息便于诊断SQL性能问题的一个“可视化”工具,但具体的问题和原因,还是要具体分析,看到的,未必是真实的,就像破案一样,这可能才是调优的乐趣所在。

近期更新的文章:

spool导出格式的问题

最近碰到的一些问题

关于数据治理的读书笔记 - 什么是数据治理?

关于数据治理的读书笔记 - 数据治理、数据管理和数据管控的理解

通过Java得到语句的执行计划

文章分类和索引:

公众号900篇文章分类和索引

以上是关于SQL调优-SQL执行性能监控的主要内容,如果未能解决你的问题,请参考以下文章

SQL调优实战-常见性能调优案例介绍(第二期)

Mysql监控调优

DB2调优 监控执行缓慢的SQL

SQL Server 性能调优 之执行计划(Execution Plan)调优

SQL性能调优

JavaMelody 项目性能监控和调优工具