在DBA总群里有网友发SOS信号说下面2个SQL,第一个在程序中很慢,到pl/sql中就很快,我看了下 这种问题一般都是执行计划不一致造成的。为什么不一致,可以去看下绑定变量窥测的问题。去看下面执行计划发现走了 R_JCXM表的 INDEX_R_JCXM_SBH
Select count(sbh) into :ll_count From R_JCXM Where SBH = :as_sbh And fcbz = :ls_fcbh And XMID = :LL_XMID and nvl(length(ygh),0) = 0 using sqlca;
Select count ( id ) From R_JCXM Where SBH ='201308030002' And fcbz ='0' And XMID =3 and nvl ( length ( ygh ) , 0 ) =0
使用HINT语句 固定执行计划让网友看效果
/*+ INDEX(R_JCXM INDEX_R_JCXM_SBH) */
Select /*+ INDEX(R_JCXM INDEX_R_JCXM_SBH) */ count(sbh) into :ll_count From R_JCXM Where SBH = :as_sbh And fcbz = :ls_fcbh And XMID = :LL_XMID and nvl(length(ygh),0) = 0 using sqlca;
长沙-阿也 15:42:14
INDEX_R_JCXM_SBH
改成这个花了0.3秒
ok 问题搞定。
这里主要2点,很多人对HINT谈之变色。认为不安全,确实因为统计信息,数据量的变化会导致一些问题的存在。但是如果SQL都运行不出来,客户叫娘了。
还能坚持固有看法吗,其实更多的是不了解HINT。
HINT 写法 /*+ INDEX(R_JCXM INDEX_R_JCXM_SBH) */
/*+空格 INDEX(表名 空格 索引名字)空格*/
另推荐我师父博客
http://blog.csdn.net/robinson1988
优化调优群号
oracle性能优化:220761024