突然某天接到某个接口执行变慢,调用超时的故障。
这个接口是一个存储过程,在前几天刚加入了新的sql进去。
通过断点这个存储过程,发现确实是卡在了这个新添加的sql中。
把sql扣出来,做oracle的执行计划分析,发现该用到索引的地方都用了,并且存储过程的效率看起来是不低的。
总结下现象:
某个sql运行了一段时间,在出问题之前,效率是没问题的,但是某天突然变慢,直接影响到了应用的执行效率,执行计划没问题,索引也没失效。
分析:
既然索引没问题,执行计划没问题,那么问题应该不在sql上。
通过后台分析,发现oracle执行该条语句的时候有两套执行计划,一套是走索引的,效率上没问题,一套是走全表扫描的,执行计划看起来也是没问题的,但是确实和走索引的是一样的的效率,明显是不正确的。
解决方法:
既然问题定位到了oracle中,那么目前就是让oracle强制使用索引了,此时需要用到oracle的hint
列出几个常用的:
/*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO=’SCOTT’;
/*+INDEX(TABLE INDEX_NAME)*/
表明对表选择索引的扫描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX=’M';