“
在 Bethune 的监控预警中,当问题具有可追溯性时,在告警右侧就会有一个可点击的小图标,帮助我们进一步分析问题。
”
下图中,系统监控发现了长事务,对于OLTP系统,长时间运行的 DML 操作是必须要多加关注的:
进一步的点击追溯,系统会呈现出详细的信息,例如用户和SQL信息等:
点击SQLID,就进入了SQL和执行计划页面。一目了然的可以看到这个 DELETE 语句,因为全表扫描的执行计划而执行缓慢,极度影响性能:
事实上,到这里 Bethune 就已经完成了整个问题的预警、根因追溯。接下来就应该是 DBA 们大显身手的地方了。
注意:监控是发现问题的手段,而如何解决问题,解决问题的时间,则要由 DBA 来决策和抉择。
DBA 可以根据数据和查询字段的选择性,来判断是否可以通过创建索引提高效率。
并且,不能在业务高峰期间进行索引创建操作,避免引发系统竞争。
SQL> select count(*) from TP_SYS_FIELDHISTORY;
COUNT(*)
----------
2430863
SQL> select count(distinct(RECORDID)) from CUST_U_ENMOTECH.TP_SYS_FIELDHISTORY;
COUNT(DISTINCT(RECORDID))
-------------------------
1944293
SQL> explain plan for delete from tp_sys_fieldhistory where recordid=:"SYS_B_0"
2 ;
Explained.
SQL> set serveroutput on
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2894643821
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 42 | 10379 (1)| 00:02:05 |
| 1 | DELETE | TP_SYS_FIELDHISTORY | | | | |
|* 2 | TABLE ACCESS FULL| TP_SYS_FIELDHISTORY | 1 | 42 | 10379 (1)| 00:02:05 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("RECORDID"=:SYS_B_0)
14 rows selected.
SQL> create index idx_tpsys_fldhist_rcd on TP_SYS_FIELDHISTORY(RECORDID) compute statistics;
Index created.
SQL> explain plan for delete from tp_sys_fieldhistory where recordid=:"SYS_B_0";
Explained.
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3460354814
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 42 | 3 (0)| 00:00:01 |
| 1 | DELETE | TP_SYS_FIELDHISTORY | | | | |
|* 2 | INDEX RANGE SCAN| IDX_TPSYS_FLDHIST_RCD | 1 | 42 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("RECORDID"=:SYS_B_0)
从以上的测试效果来看,通过一个索引的创建,原SQL的成本降低到3,效率大大提升。Bethune 在下一个版本中,将完全实现到创建之前的所有建议,实现智能化的索引推荐。