问题描述:此更新语句在过程包里执行:Update /*+index(ac20_index3)*/ ac20 set aae200='1'
 where aack01=a
   and aae002<b
   and aae140 in (c,d)
   and aae200='6';ac20_index3为建在ac20表上的联合索引的名字,联合索引含的字段依次为:
aack01、aae002、aae140、aae200。在过程包里执行大约需要10-12秒时间,而如果把此语句的参数赋值后在PL/SQL里执行却基本上是接近于0秒,0.0016秒时间。ac20表的数据量大概为600万条数据。字段类型说明:
aack01--int
aae002--varchar2(为年月的时间字符串,如“200612”,因此用小于符号)
aae140--varchar2
aae200--varchar2请各位高手指点,为什么直接赋值与参数赋值,效率却相差如此之大,该如何提高这效率呢?问题解决即刻散分,再次希望和感谢高手们帮助解决此问题。

解决方案 »

  1.   

    在pl*sql中
    alter system flush shared_pool;
    再执行看看.
      

  2.   

    alter session set sort_area_size=524288000;
    提高session执行速度
      

  3.   

    谢谢Eric_1999、tgm78() ,试了过后,情况如初。我补充说明一下,此表还建了一个联合外键(aabk01、aack01、aae002、aae140)是否会是这个原因而使效率慢呢?
      

  4.   

    在过程包里执行大约需要10-12秒时间,而如果把此语句的参数赋值后在PL/SQL里执行却基本上是接近于0秒,0.0016秒时间。在包中执行和在PL/SQL中执行本质上是完全一样的,影响速度的不是环境的问题
    2个语句相比较只有参数的数有变动,那问题只可能和参数有关联确定几个问题 
    1.在包中执行的时间10-12是仅仅这个UPDATE语句的执行时间还是整个过程或函数的执行时间
    2.你使用DBMS_OUTPUT把包中的参数SHOW出来看看是否和你自己给的是一直的:)
      

  5.   

    用参数的语句是如何写的?参数又是如何定义的?我觉得复合索引改为aack01、aae140、aae200、aae002更好
      

  6.   

    baojianjun(包子),谢谢你的帮助。确定几个问题 1.在包中执行的时间10-12是仅仅这个UPDATE语句的执行时间还是整个过程或函数的执行时间回复:仅仅是这个Update语句的时间。2.你使用DBMS_OUTPUT把包中的参数SHOW出来看看是否和你自己给的是一直的:)回复:参数是一致的。
    bobfang(匆匆过客) 谢谢你,接你的建议已试过,无变化:)。Eric_1999(╙@^@╜) ,你的建议,我又试过之后,确实效率上提高了一些,再次测试时此更新语句需要4秒时间,感谢。但有一问题再请教,执行刷新oracle数据库中的共享池时,是否会对其它正在执行的后台包业务处理产生影响?希望大家继续关注此问题,看看还有什么办法可以提高执行语句本身的效率。
      

  7.   

    运行时间的差别可能出在优化方法上的不同,在SQL plus中直接赋值的语句可以用COST优化,而带参数的语句则只能用RULE优化。可以在直接赋值的语句上加上/*+RULE*/提示后再执行看看,如果执行时间与过程中带参数的差不多,就说明是这个问题。
      

  8.   

    bobfang(匆匆过客),你好!带参数的语句在前面已帖出,不知道你说的是…