没想到oracle语句比sqlserver麻烦这么多!!!小弟有个oracle更新语句update AA set status=1,BatchNo='01003' where MM in('000038') and DD=1 and CC=0 and XX=1 and rownum<=1但是运行起来奇慢无比,但是在sqlserver数据库同数据量中运行却很快,表AA中有18000000数据,但是我运行下面的查询时select /*+INDEX(AA AA _MAIN)*/  * from XPackCodeImportTemp where MM in('000038') and DD=1 and CC=0 and XX=1 and rownum<=1
或者
select  * from AA where MM in('000038') and DD=1 and CC=0 and XX=1 and rownum<=1速度奇快无比,实在是无奈了,该如何修改那个update语句呀?? 需要说明 MM in('000038') 必须用in或者exists,因为可能有多个!哪位老大能指点一下~~多谢!!

解决方案 »

  1.   

    可能你将where后面的字段建立了复合索引
    这样查询起来很快,不过更新就非常慢了……
      

  2.   

    可能是有锁等待,不应该慢的.
    不知楼主是否有权限查看v$session表和v$lock表,如果有的话可以查一下看看锁等待情况.
      

  3.   

    update AA u
    set u.status=1,u.BatchNo='01003' 
    where exists( select 1 from AA v where v.Pk_Id = u.Pk_Id 
                  and v.MM in('000038') and v.DD=1 and v.CC=0 and v.XX=1 and rownum <=1 )
      

  4.   

    你的索引结构是怎样de是不是status和batchNo上有索引
      

  5.   

    都有索引,我现在测试另外一种办法update (select * from AA where MM in('000038') and DD=1 and CC=0 and XX=1 and rownum <=1) a set a.status=1,a.BatchNo='01003' 提示更新视图出错,如果改为update (select * from AA where MM in('000038') and DD=1 and CC=0 and XX=1) a set a.status=1,a.BatchNo='01003' where rownum <=1 这样就可以,可是这样执行非常慢,为啥呢?
      

  6.   

    SELECT INDEX_NAME,TABLE_NAME,COLUMN_NAME FROM ALL_IND_COLUMNS WHERE TABLE_NAME ='AA';
    看下结果看
      

  7.   

    你不是说有索引吗?怎么会没结果呢?
    要是可以在plsql developer右键点击表名,把建表语句贴给大伙看看吧。
      

  8.   

    lz请把update和select语句的执行计划分别贴出来
      

  9.   

    感觉这条sql已经不能再怎么修改啦
    SELECT INDEX_NAME,TABLE_NAME,COLUMN_NAME FROM ALL_IND_COLUMNS WHERE TABLE_NAME ='AA';   查出来没数据 俨然没有索引
    可能是锁等到的问题
    是生产库还是测试库
    把其他session全杀了
    再执行下看
      

  10.   

    通常的情况是:索引越多,update越慢,select越快