一个SQL性能问题的优化探索(二)(r11笔记第38天)

作者: admin 分类: 公众号存档            1 次浏览 发布时间: 2017-01-08 23:47

公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2017-01-08 23:47:18 · 原文链接

继续前几天的一个案例一个SQL性能问题的优化探索(一)(r11笔记第33天)

如下的SQL语句存在索引字段CARD_NO,但是执行的时候却走了全表扫描,因为这是一个核心表,数据量很大,导致数据库负载很高。

SQL_FULLTEXT
----------------------------------------------------------------------------------------------------
SELECT ID,CN,CARD_NO,TO_CHAR(CHARGE_DATE,'yyyy-MM-dd HH24:mi:ss') AS CHARGE_DATE ,IP,POINT,PRESENT_P
OINT,SUCCESS,CARD_TYPE,PRODUCTNUM,SALEMETHOD,ITEM_ID,SERVICEID,ORDER_NO,TO_CHAR(EXPIREDATE,'yyyy-MM-
dd HH24:mi:ss') AS EXPIREDATE,REMARK FROM RECHARGE_LOG WHERE CARD_NO = TO_NUMBER(:1)

     对于这个问题,苦于无法复现,通过各种途径进行分析,有些信息似乎有些矛盾。如果说是统计信息的问题,但是查看直方图的信息是有的。而且分为了200多个bucket,索引列card_no的统计信息也没有发现什么问题。而且比较奇怪的是问题发生后查看执行计划情况,后面的语句是可以走索引的。这个问题怎么来进一步分析呢。

    我们可以化被动为主动,我对这个列对应的索引添加了索引监控,即alter index xxxx monitoring usage;然后有了这个标识之后,就可以随时查看v$object_usage查看索引是否被启用,当然这个视图得到的信息毕竟很有限。我们只能知道索引是否被启用,但是每次启用的时间等这些没法定位,而且因为走了索引本身执行效率就很高,所以在快照中是很可能不会被收编进来的。

  这个问题还有一个疑点就是统计信息的收集时间,和同事确认问题发生当天他是没有收集统计信息的,但是查看字段last_analyzed的时间却恰恰是发生收集以后。

   问题暂时搁置下来,在这两天问题有了进一步的发现,另外一个报警引起了我的注意。报警是CPU使用率较高,查看数据库层面的负载也突然有了较大的抖动。

定位到相关的语句如下:

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注