01
—
背景
在数据库运维过程中,当出现SQL语句执行效率低下时,精准定位性能瓶颈的关键在于全面获取语句运行时信息。传统人工排查需要手动收集执行计划、系统资源、锁等待、索引状态等多维度数据,过程繁琐且易遗漏。为此编写自动化采集脚本工具,可一键式捕获包括SQL执行计划、耗时统计、表结构等关键诊断信息。通过标准化输出报告,提升了性能分析效率,为后续的SQL优化提供完整的数据支撑。
02
—
脚本功能说明
目前SQL脚本实现功能如下。CREATEOR REPLACE PACKAGE DM_SQL_RPT AS–获取所有PROCEDURE GET_ALL_INFO(EXEC_ID INBIGINT);–获取SQL涉及表信息PROCEDURE GET_TAB_INFO(EXEC_ID INBIGINT);–获取表涉及索引PROCEDURE GET_IDX_INFO(EXEC_ID INBIGINT);–获取SQL涉及表的统计信息PROCEDURE GET_STAT_INFO(EXEC_ID INBIGINT);–获取SQL执行计划PROCEDURE GET_SQL_PLAN(EXEC_ID INBIGINT);–获取et信息PROCEDURE GET_SQLET_INFO(EXEC_ID INBIGINT);–获取SQL缓存的执行计划PROCEDURE GET_SQLPLN_CACHE(EXEC_ID INBIGINT);END DM_SQL_RPT;ps:脚本工具在公众号回复关键字:SQL信息一键采集脚本,即可获取工具03
—
使用示例
提供的这个示例即为完整过程
1. 将脚本的SQL语句放到数据库中执行
2. disql工具中开启MONITOR_SQL_EXEC参数
3. 开启set serveroutput on
4. 执行慢SQL
5. 执行脚本中包的功能函数
此时会输出SQL的关联表的信息以及表字段和表的索引信息。最下面就是SQL的执行计划以及ET信息。
–disql登录,创建包后,开启 MONITOR_SQL_EXECSQL> SF_SET_SESSION_PARA_VALUE (MONITOR_SQL_EXEC, 1);DMSQL executed successfullyused time: 0.752(ms). Execute id is69801.–开启 set serveroutput on SQL>set serveroutput on–执行问题SQL SQL>select a.id,a.c1,b.c1 from test_left01 a join test_left02 b on a.id=b.id;used time: 28.112(ms). Execute id is69803.–获得 SQL执行ID,调用脚本的存储过程”获取所有” SQL>call DM_SQL_RPT.GET_ALL_INFO(69803); ###################################################################################### TABLE INFO : SYSDBA.TEST_LEFT01———————————————————————————| OWNER| TABLE_NAME| NUM_ROWS| LAST_ANALYZED| PARTITIONED| TEMPORARY|———————————————————————————| SYSDBA| TEST_LEFT01|NULL|NULL|NO| N|———————————————————————————##### COLUMN INFO : SYSDBA.TEST_LEFT01———————————————————————————| COLUMN_ID| COLUMN_NAME| COLUMN_TYPE| NULLABLE| DEFAULT_VAL|———————————————————————————|1| ID|VARCHAR(100,0)| Y|NULL||2| C1|INT(4,0)| Y|NULL||3| C2|VARCHAR(100,0)| Y|NULL|###################################################################################### TABLE INFO : SYSDBA.TEST_LEFT02———————————————————————————| OWNER| TABLE_NAME| NUM_ROWS| LAST_ANALYZED| PARTITIONED| TEMPORARY|———————————————————————————| SYSDBA| TEST_LEFT02|NULL|NULL|NO| N|———————————————————————————##### COLUMN INFO : SYSDBA.TEST_LEFT02———————————————————————————| COLUMN_ID| COLUMN_NAME| COLUMN_TYPE| NULLABLE| DEFAULT_VAL|———————————————————————————|1| ID|VARCHAR(100,0)| N|NULL||2| C1|VARCHAR(100,0)| Y|NULL||3| C2|VARCHAR(100,0)| Y|NULL||4| C3|CLOB(2147483647,0)| Y|NULL|———————————————————————————######################################################################################################### INDEX INFO : SYSDBA.TEST_LEFT01CREATEOR REPLACE INDEX “SYSDBA”.”IX_TEST_LEFT01″ ON “SYSDBA”.”TEST_LEFT01″(“ID” ASC,”C1″ ASC) STORAGE(ON “MAIN”, CLUSTERBTR) ;—————————————————————————————————-| ID| INDEX_NAME| COLUMN_NAME| COLUMN_POSITION| DESCEND| TYPE| XTYPE| FLAG|—————————————————————————————————-|33555472| IX_TEST_LEFT01| ID|1|ASC| BT| SEC|0||33555472| IX_TEST_LEFT01| C1|2|ASC| BT| SEC|0|—————————————————————————————————-######################################################################################################### INDEX INFO : SYSDBA.TEST_LEFT02The index created bysystemis forbidden to indexdef.—————————————————————————————————-| ID| INDEX_NAME| COLUMN_NAME| COLUMN_POSITION| DESCEND| TYPE| XTYPE| FLAG|—————————————————————————————————-|33555474| INDEX33555474| ID|1|ASC| BT|17|5|—————————————————————————————————-CREATEOR REPLACE INDEX “SYSDBA”.”IX_TEST_LEFT02″ ON “SYSDBA”.”TEST_LEFT02″(“ID” ASC,”C1″ ASC) STORAGE(ON “MAIN”, CLUSTERBTR) ;—————————————————————————————————-| ID| INDEX_NAME| COLUMN_NAME| COLUMN_POSITION| DESCEND| TYPE| XTYPE| FLAG|—————————————————————————————————-|33555475| IX_TEST_LEFT02| ID|1|ASC| BT| SEC|0||33555475| IX_TEST_LEFT02| C1|2|ASC| BT| SEC|0|—————————————————————————————————-##### TABLE STATS INFO : SYSDBA.TEST_LEFT01 STATISTICS IS NULL.##### TABLE STATS INFO : SYSDBA.TEST_LEFT02 STATISTICS IS NULL.###################################################################################################################################################### SQL PLAN INFO :————————————————————————————————————————————————-| SEQ| DEP|SQL_PLAN |————————————————————————————————————————————————-|1|0|#NSET2: [2,337,148]; CPU_COST:0; IO_COST:2||2|1| #PRJT2: [2,337,148]; CPU_COST:0; IO_COST:2||3|2| #NEST LOOP INDEX JOIN2: [2,337,148]; CPU_COST:0; IO_COST:2||4|3| #SSCN: [1,337,52]; IX_TEST_LEFT01[is_global(0)](TEST_LEFT01 AS A); CPU_COST:0; IO_COST:1||5|3| #BLKUP2: [2,1,48]; INDEX33555474(TEST_LEFT02 AS B); CPU_COST:2; IO_COST:0||6|4| #SSEK2: [2,1,48]; SCAN_TYPE(ASC); INDEX33555474[is_global(0)](TEST_LEFT02 AS B); SCAN_RANGE[A.ID,A.ID]; CPU_COST:2; IO_COST:0|————————————————————————————————————————————————-######################################################################################################### SQL ET INFO :—————————————————————————————————-| OP|TIME(MS)|PERCENT| RANK| SEQ|N_ENTER| MEM(KB)| DISK(KB)| HASH_CELLS| HASH_CONFLICT|—————————————————————————————————-| DLCK|0.03|0.07%|7|0|3|0|0|0|0|| SSCN|0.12|0.24%|6|4|3|0|0|0|0|| NSET2|6.62|13.00%|5|1|340|0|0|0|0|| PRJT2|7.28|14.30%|4|2|676|0|0|0|0|| IJI2|10.45|20.51%|3|3|1015|0|0|0|0|| SSEK2|11.01|21.62%|2|6|674|0|0|0|0|| BLKUP2|15.41|30.26%|1|5|1348|0|0|0|0|—————————————————————————————————-DMSQL executed successfullyused time: 75.953(ms). Execute id is69804.近期文章
— END —
特别说明:本文所述内容仅代表作者个人在现阶段技术认知下的观点,受限于DM8(2024Q4)版本,未来可能随版本技术迭代而调整更新,期待未来能与大家探讨更优解!为防走失,也请各位顺手关注一下公众号“”
👇订阅下方合集,获取每日推送