首页 » ORACLE 9i-23ai » Query dba_autotask_client slow?

Query dba_autotask_client slow?

最近在整理巡检脚本时,发现在执行select client_name,status from dba_autotask_client;时耗时几十秒, 该SQL只是想检查数据库级的自动任务是否启用(如自动收集统计信息), 返回的记录也并不多,只关心状态,如下输出.

SQL> select client_name,status from dba_autotask_client;

CLIENT_NAME                                                      STATUS
---------------------------------------------------------------- --------
sql tuning advisor                                               ENABLED
auto optimizer stats collection                                  ENABLED
auto space advisor                                               ENABLED

但是细看执行计划其实涉及的对象较多, 使用sqlmonitor可以明确,执行时间90%+是花在SCHEDULER$_EVENT_LOG的FULL TABLE SCAN, 刚好这个库有近200个JOB or scheduler 所以日志非常大,该表记录近150万, 可以使用下面的方法清理JOB 日志。

exec DBMS_SCHEDULER.PURGE_LOG();
-- or --
truncate table sys.scheduler$_event_log;

所以如果只是需要上面的查询结果可以使用VIEW 定义中的部分SQL:

SELECT C.CNAME_KETCL,
DECODE(dbms_auto_task.get_client_status_override(CR.CLIENT_ID),
1, 'DISABLED',
decode(CR.STATUS, 2, 'ENABLED',  1, 'DISABLED', 'INVALID'))
AS STATUS  FROM X$KETCL C, KET$_CLIENT_CONFIG CR
WHERE C.CID_KETCL = CR.CLIENT_ID
AND CR.OPERATION_ID = 0
AND C.CID_KETCL > 0
AND (BITAND(C.ATTR_KETCL,2048) = 0
OR 999999 < (SELECT TO_NUMBER(VALUE)
FROM V$SYSTEM_PARAMETER
WHERE NAME = '_automatic_maintenance_test'))


Plan hash value: 864851597

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name               | E-Rows |E-Bytes| Cost (%CPU)|  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                    |        |       |     2 (100)|       |       |          |
|*  1 |  HASH JOIN                           |                    |      3 |    96 |     2   (0)|  1236K|  1236K|  547K (0)|
|*  2 |   FIXED TABLE FULL                   | X$KETCL            |      4 |    96 |     0   (0)|       |       |          |
|*  3 |    HASH JOIN                         |                    |      1 |    56 |     1 (100)|  1098K|  1098K|  425K (0)|
|*  4 |     FIXED TABLE FIXED INDEX          | X$KSPPI (ind:1)    |      1 |    38 |     0   (0)|       |       |          |
|   5 |     FIXED TABLE FULL                 | X$KSPPSV           |   5440 | 97920 |     1 (100)|       |       |          |
|   6 |   TABLE ACCESS BY INDEX ROWID BATCHED| KET$_CLIENT_CONFIG |      6 |    48 |     2   (0)|       |       |          |
|*  7 |    INDEX RANGE SCAN                  | KET$_CL_PK         |      6 |       |     1   (0)|       |       |          |
----------------------------------------------------------------------------------------------------------------------------


这样执行就可以秒级返回了。

打赏

对不起,这篇文章暂时关闭评论。