在SQLPLUS中执行一条单表查询的SQL语句,该SQL语句查询的数据量大约是14000多条记录,SQL语句很长,其where条件中有三个字段是用的in,且in的数目教多,但这三个字段都做了索引,该表的总记录数是500万,执行该sql语句的速度还可以,大约1分钟吧,但是它一执行就会导致shared pool暴涨,用工具看该语句所占用的shared memory高达120多兆,多执行两次该语句,立刻就导致shared pool满掉,请高手帮忙分析一下原因,谢谢!数据库是ORACLE 8.1.6.

解决方案 »

  1.   

    已经试过了,将in后的东西全部改成了or,但是情况还是一样!郁闷!
      

  2.   

    share pool用于保存SQL语句的执行计划和分析树。当执行SQL语句时,系统会将相应的执行计划和分析树保存到共享SQL池中。
    当系统再次执行同样的SQL语句时候,可以不用分析,直接使用原有执行计划和计划树(不是肯定可以,因为不能保证一个SQL语句的计划长住内存)。
    你的SQL是同一个SQL吗,基本上ORACLE只认一模一样的SQL(讲师说的)
      

  3.   

    可能是因为你的sql 代码没有共享,尽量使用
    变量
      

  4.   

    你可能用到以下两个参数了:
    session_cached_cursors
    cursor_space_for_time=true
    把session_cached_cursors调小一点,把cursor_space_for_time置为false就可以了。