达梦DM8 SQL优化之DBMS_SQLTUNE包使用方法
1. 概述
DBMS_SQLTUNE包提供一系列对实时SQL监控的方法。当SQL监控功能开启后,DBMS_SQLTUNE包可以实时监控SQL执行过程中的信息,包括:执行时间、执行代价、执行用户、统计信息等情况。
SQL监控功能开启的方法是将 DM.INI 参数 ENABLE_MONITOR 和 MONITOR_SQL_EXEC 均设置为1。MPP环境下,当前节点执行的SQL,只能在当前节点查询监控报告,其他节点无法查询。
2. 相关方法
1) REPORT_SQL_MONITOR --返回单个 SQL 的实时监控报告。
2) REPORT_SQL_MONITOR_LIST --返回被监控 SQL 的概要信息列表。
3) CREATE_TUNING_TASK --创建语句调优任务。
4) EXECUTE_TUNING_TASK --执行语句调优任务。
5) REPORT_TUNING_TASK --输出语句调优报告。
6) DROP_TUNING_TASK --删除语句调优任务。
3. 示例
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。
SQL> SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_SQLTUNE');
DMSQL 过程已成功完成
已用时间: 65.653(毫秒). 执行号:500.
3.1 例1:监控 SQL 语句。
1)开启 SQL 监控开关。
设置 DM.INI 参数 ENABLE_MONITOR 和 MONITOR_SQL_EXEC 为 1。
SQL> SP_SET_PARA_VALUE (1,'ENABLE_MONITOR',1);
DMSQL 过程已成功完成
已用时间: 5.274(毫秒). 执行号:501.
SQL> SP_SET_PARA_VALUE (1,'MONITOR_SQL_EXEC',1);
DMSQL 过程已成功完成
已用时间: 2.553(毫秒). 执行号:502.
2)执行 SQL 语句。
SQL> SELECT * FROM DBA_OBJECTS;
行号 OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED
---------- ----- ---------------- -------------- --------- -------------- ----------- ---------------------------
LAST_DDL_TIME TIMESTAMP STATUS TEMPORARY GENERATED SECONDARY NAMESPACE EDITION_NAME
--------------------------- --------------------------- ------ --------- --------- --------- --------- ------------
1387 SYS UTL_URL NULL 268436700 NULL DSYNOM 2022-04-24 21:18:00.655064
2022-04-24 21:18:00.000000 2022-04-24 21:18:00.000000 VALID N NULL NULL NULL NULL
1388 SYS V$RESOURCE_LIMIT NULL 268436595 NULL DSYNOM 2022-04-24 21:17:59.099630
2022-04-24 21:17:59.000000 2022-04-24 21:17:59.000000 VALID N NULL NULL NULL NULL
1389 SYS XCOL NULL 268436663 NULL DSYNOM 2022-04-24 21:18:00.159521
2022-04-24 21:18:00.000000 2022-04-24 21:18:00.000000 VALID N NULL NULL NULL NULL
行号 OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED
---------- ----- ---------------- -------------- --------- -------------- ----------- ---------------------------
LAST_DDL_TIME TIMESTAMP STATUS TEMPORARY GENERATED SECONDARY NAMESPACE EDITION_NAME
--------------------------- --------------------------- ------ --------- --------- --------- --------- ------------
1390 SYS XCSR NULL 268436662 NULL DSYNOM 2022-04-24 21:18:00.159103
2022-04-24 21:18:00.000000 2022-04-24 21:18:00.000000 VALID N NULL NULL NULL NULL
1390 rows got
已用时间: 57.203(毫秒). 执行号:503.
SQL> SELECT * FROM DBA_USERS;
行号 USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE DEFAULT_TABLESPACE
---------- ------------ ----------- -------- -------------- --------- --------------------------- ------------------
DEFAULT_INDEX_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE
------------------------ -------------------- --------------------------- --------------------------------
INITIAL_RSRC_CONSUMER_GROUP EXTERNAL_NAME PASSWORD_VERSIONS EDITIONS_ENABLED AUTHENTICATION_TYPE
--------------------------- ------------- ----------------- ---------------- -------------------
NOWDATE
---------------------------
5 SYS 50331648 NULL OPEN NULL NULL SYSTEM
SYSTEM TEMP 2022-04-24 21:17:58.082330 /dm8/dmdbms/data/dm02/SYSTEM.DBF
NULL NULL 0 Y NDCT_DB_AUTHENT
2022-05-26 15:35:45
已用时间: 23.265(毫秒). 执行号:504.
SQL>
得到两条 SQL 语句的执行号 SQL_EXEC_ID 分别为 503 和 504。
3)查询 SQL 监控报告。
为了能够完整展示 SQL 监控报告,特使用 SET 命令将将 DIsql 环境变量 LONG 设置成一个较大值 999999。
SQL>SET LONG 999999
根据 SQL 执行号来查询监控报告。
SQL>SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=503) FROM DUAL;
SQL>SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=504) FROM DUAL;
4)查询 SQL 监控报告链表。
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR_LIST() FROM DUAL;
3.2 例2: SQL语句调优。
准备数据表。
SQL> CREATE TABLE TEST(C1 INT);
SQL> INSERT INTO TEST VALUES(1);
SQL> INSERT INTO TEST VALUES(2);
SQL> INSERT INTO TEST VALUES(3);
1)创建语句调优任务。
SQL> DBMS_SQLTUNE.CREATE_TUNING_TASK('SELECT C1 FROM TEST', TASK_NAME=>'TASK1');
DMSQL 过程已成功完成
已用时间: 3.987(毫秒). 执行号:505.
2) 执行语句调优任务。
SQL> DBMS_SQLTUNE.EXECUTE_TUNING_TASK('TASK1');
DMSQL 过程已成功完成
已用时间: 5.648(毫秒). 执行号:506.
3) 输出语句调优报告。
--首先将环境变量 LONG 设置成一个较大值 999999,以保证完整显示调优报告
SQL> SET LONG 999999
SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK1');
行号 DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK1')
---------- ---------------------------------------------------------------------------------------------------------------------------
1 GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
TUNING TASK NAME : TASK1
TUNING TASK OWNER : SYSDBA
WORKLOAD TYPE : SINGLE SQL STATEMENT
EXECUTION COUNT : 1
CURRENT EXECUTION : SYSEXECNAME_1
EXECUTION TYPE : TUNE SQL
SCOPE : COMPREHENSIVE
TIME LIMIT(SECONDS) : 1800
COMPLETION STATUS : COMPLETED
STARTED AT : 2022-05-26 15:55:06
COMPLETED AT : 2022-05-26 15:55:06
SQL TEXT : SELECT C1 FROM TEST
-------------------------------------------------------------------------------
FINDING SECTION (2 FINDING(S))
-------------------------------------------------------------------------------
1 - STATISTICS FINDING
----------------------
尚未分析表 SYSDBA.TEST。
RECOMMENDATION
--------------
考虑收集此表的优化程序统计信息。
CALL DBMS_STATS.GATHER_TABLE_STATS('SYSDBA', 'TEST');
2 - INDEX FINDING
-----------------
通过创建一个或多个索引可以改进此语句的执行计划。
RECOMMENDATION
--------------
考虑运行创建推荐的索引。
CREATE INDEX IDX$$_1 ON "SYSDBA"."TEST"("C1");
-------------------------------------------------------------------------------
已用时间: 2.473(毫秒). 执行号:507.
SQL>
四 删除语句调优任务。
SQL> DBMS_SQLTUNE.DROP_TUNING_TASK('TASK1');
DMSQL 过程已成功完成
已用时间: 4.757(毫秒). 执行号:508.
达梦数据库社区地址:https://eco.dameng.com/