本人使用tomcat+oracle9i开发项目,当多个用户一起update数据库中的yuqingdongtai表时,操作就变得很慢了。而操作其他的表并不受到影响,我在pl/sql中测试的:SQL> select max(id) from yuqingdongtai;
 
   MAX(ID)
----------
    630472
 
Executed in 27.047 seconds
SQL> update yuqingdongtai set isextract='tjf',isignore=1 where id=630472;
 
1 row updated
 
Executed in 25.516 seconds
SQL> select count(*) from users;
 
  COUNT(*)
----------
        15
 
Executed in 0.032 seconds而等了一段时间过后,再次查询select max(id) from yuqingdongtai;速度就快很多了。
然后我一个用户两个用户一起进行update操作,速度还是很快的,但只要超过三个人,速度立马就慢了!!!
这可能是什么原因造成的啊?是不是表锁住了???

解决方案 »

  1.   

    判断一下update时,程序加的锁是表锁还是行锁,应该使用行锁,如果是表锁的话会非常影响速度的。
      

  2.   

    当多个用户一起update数据库中的yuqingdongtai表时,操作就变得很慢了
    -- update 的时候会对表加行级锁,在这个事务还没有提交或者回滚之前,其他事务是不能进行操作的。 所以同时操作会有等待,这个等待就表现在慢上。 关于锁的内容,参考:
      锁 死锁 阻塞 Latch 等待 详解
      http://blog.csdn.net/tianlesoftware/archive/2010/08/19/5822674.aspx
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    DBA1 群:62697716(满); DBA2 群:62697977(满)
    DBA3 群:63306533;     聊天 群:40132017
      

  3.   

    有没有sql可以查看当前表锁状态或行锁状态的啊???
    select sid,lockwait from v$session???
      

  4.   

    oracle 的 select 语句不会请求任何锁,也不会被其他锁阻塞。
    update 语句执行时间过长的原因有可能是被其他锁阻塞,但是 select 语句执行时间过长的原因应该不是被其他锁阻塞。lz 可以在执行 select 语句时查询 v$session_wait 视图,检查一下 select 语句在那些事件上等待了过长的时间。
      

  5.   

    支持5楼大哥。说的很在理。也请查看下你的CPU。是否你的系统问题影起的。或是程序问题。忘记关闭连接啦。还是程序运行时有问题,造成CPU过高导致查询慢
      

  6.   

    个人感觉, LZ使用了BITMAP索引. BITMAP索引会产生entry等待也就是同一时刻只能有一个用户在操作, 道理上来说用索引应该是查询超级快的, 只有3,4次IO, 而你的操作居然到达了27秒, 可见不是使用B-TREE索引。 尝试使用B-TREE索引吧。就不会这样了。  当然我只是猜测, 没有足够的信息。 楼主可以使用sql trace 来跟踪session 然后使用tkprof来查看执行计划, 会有很好的效果。呵。