?????
就是select的话,oracle是不会串行化用户的并发访问的。你的存储过程中是不是由锁住表的操作,导致其他用户等待。

解决方案 »

  1.   

    1.不加表锁,加行锁2.如果为连接查询加锁指定要加锁的表,语法好像是
    select xxx from a,b for update on a.col
      

  2.   

    要不就是select xxx from a,b for update of a.col
      

  3.   

    可能是我没说清楚,我的存储过程中没有任何的锁表(行)语句。
    假如做一个java多线程运行同一个存储过程,那么你会发现执行是同步运行的,也就是只有上一个线程的存储过程运行完毕后,下一下其它的线程才能再执行此存储过程。
    但我想实现存储过程的并发执行!!
      

  4.   

    我现在碰到和你一样的问题,我不管是多线程,多进程,多连接。
    都不能并行,我连查询都没有,我就是在存储过程中设了个循环让他执行5秒。
    结果假如一个执行要5秒,那么我现在十个同时执行却需要50秒,然后同时结束。
    我想的问题是不是我在存储过程中的循环耗了太多的CPU??
    然后我想是不是因为单个CPU是无法并行,
    虽然表面好像五个同时完成,但是时间确实原来一个的五倍!!!
    所以我在想一个CPU的话是无法并行的!!!!!!!!!!!!!!!!!
    如果您想并行是不是要增加CPU的方式??????
    好像ORACLE中查询也是需要多CPU才能达到并行的效果!!!!!
      

  5.   

    另外,我还用了一个测试用例。
    我的一个查询,单单查询用了5秒左右,
    然后我开了五SQLPLUS几乎同时执行,结果也是同时出来结果,但是时间是40秒左右。
    所以只能说明对同一个功能,比如同一个查询,
    如果是同时进行的话是串行的。
    我的查询语句是:
    select count(*) from (select tel_no,project_id,callup_times,callup_date,bureau_id from cc_callup_data
    where bureau_id in (select bureau_id from cc_callup_status where status ='Y')
    and project_id in (select project_id from cc_callup_to_flag where callup_flag= '0')
    and Callup_Flag <> '2' order by callup_flag desc,callup_times asc );用set timing on
    来算查询时间,CPU只有一个。呵呵
      

  6.   

    另外,用上面的测试用例测试,
    CPU使用并没有达到100%,CPU是有空闲的,
    况且我的执行都没有同时进行,我是等了一下才进行的,
    结果时间还是差不多一个进程执行的五倍,假设我用了五个进程。不知道我这样测试有没有正确,请大家指教
      

  7.   

    问题不在cpu上,瓶颈在磁盘的效率上不知道并行读取同一张表是否会快一些,是否会将请求平均分配给不同的磁盘oralce一般会对历史的sql进行解析缓存,和数据缓存在前一次sql缓存的前提下(相同或相近的sql),执行sql效率会比较高
      

  8.   

    yangyipeng(我不是新手·才怪) 
    --另外,我还用了一个测试用例。
    --我的一个查询,单单查询用了5秒左右,
    --然后我开了五SQLPLUS几乎同时执行,结果也是同时出来结果,但是时间是40秒左右。
    --所以只能说明对同一个功能,比如同一个查询,
    --如果是同时进行的话是串行的。
    我认为不是串行执行的,如果是的话,结果就不是同时出来。Oracle肯定考虑到了并发处理。你的问题我觉得可能的答案是磁盘IO的瓶颈问题,最好是尽量优化sql语句。