暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Bethune 使用技巧:如何使用 Bethune 下钻功能探查数据库深层问题

原创 eygle 2020-01-15
1878

在 Bethune 的监控预警中,当问题具有可追溯性时,在告警右侧就会有一个可点击的小图标,帮助我们进一步分析问题。

下图中,系统监控发现了长事务,对于OLTP系统,长时间运行的 DML 操作是必须要要多加关注的:
BethuneX10.jpg

进一步的点击追溯,系统会呈现出详细的信息,例如用户和SQL信息等:
BethuneX11.jpg

点击SQLID,就进入了SQL和执行计划页面。一目了然的可以看到这个 DELETE 语句,因为全表扫描的执行计划而执行缓慢,极度影响性能:
BethuneX12.jpg

事实上,到这里 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 在下一个版本中,将完全实现到创建之前的所有建议,实现智能化的索引推荐。

最后修改时间:2023-04-06 11:44:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论