我在用java调用一个存储过程时,oracle已经记录了一些数据。在v$sqlarea中,有sql_text,CPU_TIME ,ELAPSED_TIME 几个字段记录了值,有一些不明白的地方,看下面的列表:
   sql_text                                                     CPU_TIME    ELAPSED_TIME
                                       
select   ……                                                     15675              70142
BEGIN SP_SELECT(:1,:2,:3,:4,:5,:6); END;                   78827      337570
           
注:此存储过程主要的select语句是第一行以省略形式写的这个。-----第一行和第二行的数据怎么差别这么大?
1.oracle到底是怎么记录存储过程的执行情况的呢,
2.我的这个存储过程执行情况是应该把两者都考虑呢,还是只看第一行,或者是第二行数据呢?
3.另外,我如果再执行一次这个存储过程,两行中的cpu执行时间和响应时间都会不同程度的增加,但是增量不大,也就是说数据已经发生了变化,到底该这样计算这个存储过程的cpu利用率呢?
4.还有内存方面的,比如存储过程消耗的共享区是两者的和,还是只是第二行就可以。 不知道我说明白了没有?大家能明白我的意思吗?请各位朋友帮忙!谢谢!

解决方案 »

  1.   

    第二行是SP_SELECT的总的执行情况,第一行是其中的一部分。从trace的结果,Statspack 或AWS report上看会很清楚。
      

  2.   

    oracle好像也有缓存机制  为啥响应时间会增大   机器问题?
      

  3.   

    to f0310:
    1. 还没怎么用过trace呢,我用用看。
    2.那你说该怎么衡量这个存储过程的cpu利用率呢?------------我是想根据cpu利用率调节负载。
    3. 还有,就是我后面的问题,       另外,我如果再执行一次这个存储过程,两行中的cpu执行时间和响应时间都会不同程度的增加,但是增量不大,也就是说数据已经发生了变化,到底该这样计算这个存储过程的cpu利用率呢? 
           还有内存方面的,比如存储过程消耗的共享区是两者的和,还是只是第二行就可以。   
    我再贴一下实验结果:
    SQL_TEXT  SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM CPU_TIME ELAPSED_TIMEselect ……           26587              2088        9520    15672          58392 
    SP_SELECT       16937          748      300    78830         342706 
    ???为何第一部分比第二部分的所需要的共享内存还大,并且大26587-16937这么多? 这是第一次执行的情况。当我再执行一次时:
    SQL_TEXT  SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM CPU_TIME ELAPSED_TIMEselect ……           26587              2088        9520             19962    62682
    SP_SELECT     16937        748     300              88481         367976 从数据显示,第二次执行此存储过程,两行的CPU_TIME和ELAPSED_TIME都发生了变化。第二次两者的
    CPU_TIME/ELAPSED_TIME(第二次) > CPU_TIME/ELAPSED_TIME (第一次),难道说第一次的cpu利用率比第二次低。
    还是因为程序已经在内存里面,第二次执行时主要用cpu就行。那么当我再执行多次时,该如何衡量cpu利用率呢?????
      

  4.   

    2. CPU time/Elapsed time用来表示CPU使用率没错,但是在V$SQLAREA中CPU_TIME和ELAPSED_TIME都是累计的,所以应该用两次运行的差来比。比如select的差都是4290,使用率是1,SP_SELECT的差不一样,使用率只有0.38。仅从这些数据看不出来真正的问题,所以需要trace来分析在什么地方有waits。再者,CPU使用率=1也并非指有效的运行,还要看CPU是否浪费。
    3. 两个内存是分开的,应当计算其和。内存纪录cursor的方式按照其内容有所不同,所以一个程序内含sql语句也不能肯定程序本身所占的空间就比sql语句大。
      

  5.   

    to f0310:
    我是想根据cpu利用率调节负载。当前cpu利用率低时,放入高cpu利用率的,当前cpu利用率高时,放入低cpu利用率的。你说这样可以调节负载吗?我调节固定的存储过程请求。
      

  6.   

    那你得用statspack(9i-)或AWS(10g+)的reports来看workload,从中可以看出CPU的分配,然后来决定怎样平衡。
      

  7.   

    to f0310:
    1.CPU_TIME 和ELAPSED_TIME 的单位是毫秒吗? 15672毫秒是不是15.672秒啊?如果这样数值也太大了吧,执行时间没有这么长啊 !
    2.我用sql_trace工具和 sql_area两种方法得到了不同的结果如下:-----------------------------------------sql_trace工具里面:BEGIN SP_SELECT(:1,:2,:3,:4,:5,:6); END;call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.00          0          0          0           0
    Execute      1      0.03       0.08          0          0          0           1
    Fetch        0      0.00       0.00          0          0          0           0
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total        2      0.03       0.08          0          0          0           1Misses in library cache during parse: 1
    Misses in library cache during execute: 1
    Optimizer mode: ALL_ROWS
    Parsing user id: 64  -----------------------------------------sql_area里面:
    BEGIN SP_SELECT(:1,:2,:3,:4,:5,:6); END;  203793 2753491 这两种方法得到结果怎么差别这么大呢?