在V$SQL视图中找到程序老是停在这个语句上
select count(*) CNT from TABLE_NAME where cl > :a
上面的语句直接执行效率很快。
USER_IO_WAIT_TIME
11824000544
这个问题遇到很多次,在程序中老有SQL语句执行不出来结果,但是直接在TOAD或者PLSQL中执行效率很快。
请问高手此问题如何解决?是什么原因造成的?

解决方案 »

  1.   

    建议
    -------------------------------------------
    (1) 检查问题出现时的环境状况:
       (a)CPU情况,是否有程序很忙,可能占用了磁盘IO很多、数据库IO很多,导致其它进程等待资源。
       (b)本程序的内存是否很大。可能导致进程达到操作系统的资源配额限制。
       (c)数据库的IO情况,可以在OEM中看到。可能有其它事务占用了IO资源。
       (d)session锁等待情况,可以在toad中看到。是否该语句等待其他语句执行的锁释放。尤其是当该表是一个事务很多的表情形下。
    (2) 如果上述都不是问题,估计要更多的跟踪一下程序,可能程序挂在什么地方了。
    (3) "但是直接在TOAD或者PLSQL中执行效率很快。"这只能说明:(a)没有语法错误 (b)可以在正常情况下较快执行。
      

  2.   

    CPU大多时候超过50%,但是也没有达到太高,太高有告警的。
    程序内存不大,并且存储过程也有类似情况。
    数据库的IO没看,不会看,但是整个主机的IO一直很高。
    当时是没锁的。该表确实有其他程序写入,但是就一个程序写入,把程序写入的程序停了,还是有这样的情况。
    我想不会是程序的问题。本函数内的实现很简单,就是连数据库取需要的值放入容器。
      

  3.   

    select count(*) CNT from TABLE_NAME where cl > :a看看 直接 COUNT具体某个字段 不要COUNT(*)
      

  4.   

    估计是执行计划问题, 直接在TOAD或者PLSQL中执行计划计划与你程序中的不一样。
      

  5.   

    count(*) 不好,*表示所有字段,我一般需要统计的时候,都直接用count(1)
      

  6.   


    数据库的IO没看,不会看,但是整个主机的IO一直很高。
    ----------------------------------------------
    可能就是这个问题