Oracle诊断案例-Sql_trace之一(转)

Oracle诊断案例-Sql_trace之一

问题描述:

这是帮助一个公司的诊断案例.
应用是一个后台新闻发布系统.

症状是,通过连接访问新闻页是极其缓慢
通常需要十数秒才能返回.

这种性能是用户不能忍受的.

操作系统:SunOS 5.8
数据库版本:8.1.7

1.检查并跟踪数据库进程

诊断时是晚上,无用户访问
在前台点击相关页面,同时进行进程跟踪

查询v$session视图,获取进程信息

 
 


启用相关进程sql_trace

 
 


等候一段时间,关闭sql_trace

 
  
 
 

2.检查trace文件

检查发现以下语句是可疑的

 
  


这里显然是根据articleId进行新闻读取的.
很可疑的是query读取有3892

这个内容引起了我的注意.
如果遇到过类似的问题,大家在这里就应该知道是怎么回事情了.
如果没有遇到过的朋友,可以在这里思考一下再往下看.

 
   
 
   

3.登陆数据库,检查相应表结构

 
   


我们注意到,IDX_ARTICLEID索引在以上查询中都没有被用到.

检查表结构:
 
   

问题发现:
因为ARTICLEID是个字符型数据,查询中给入的articleId= 20030700400141 是一个数字值
Oracle发生潜在的数据类型转换,从而导致了索引失效
 
   

4.解决方法

简单的在参数两侧各增加一个',既可解决这个问题.

对于类似的查询,我们发现Query模式读取降低为2
几乎不需要花费CPU时间了

 
  


至此,这个问题得到了完满的解决

5.总结

在Oracle开发中,我们应该尽量避免使用隐式的数据类型转换
因为隐式数据类型转换可能会带来索引失效的问题.

这些问题,在开发阶段就应该被避免.

使用函数导致索引失效的问题与此类似.
本例给出了一个诊断问题的方法,供大家商榷参考.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/644902/viewspace-159219/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/644902/viewspace-159219/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值