oracle数据库中-表 cm_khjldk是个有7万多条数据的大表,
其索引为 khrq、zh、jkbh
用下面这个语句来更新某行记录update cm_khjldk set ye=2 
where
khrq=to_date('20051231','yyyymmdd') 
and zh='13000000000001'
and jkbh='0001'几十分钟过去,都没执行完。
有没有办法优化?
跪求请高人指点!!!

解决方案 »

  1.   

    khrq、zh、jkbh的字段类型是什么,是不是日期、字符、字符型
    否则类型不对的话,是使用不到索引的
    在则最好建一个复合索引(khrq,zh,jkbh)
    khrq=to_date('20051231','yyyymmdd') 
    and zh='13000000000001'
    and jkbh='0001'
      

  2.   

    如果没有锁,再执行
    select count(*) cm_khjldk where khrq=to_date('20051231','yyyymmdd') and zh='13000000000001' and jkbh='0001'
    看看速度怎样。
      

  3.   

    第一,你看执行计划,是否真的用上索引,有必要的话,按照1楼的建议加上函数索引;第二,你的语句是否在每次执行的时候出现过重复解析?——记住,不是完全取决于你说的70000多条记录的问题,我曾经有过从8000多条记录(一天的增量复制出来)的本地表读取数值,进行其他表的数值更新,也是运行了3个小时多,后来用了绑定变量的写法,时间压缩为20多分钟,所有改进最关键的就是便免了update语句反复的解析!
    一段例子
     sql_str := ('update '||v_tblname||' t2 set a'||v_colnum||' = (:1)  where t2.datatime = (:2)');       ----v_tblname 和 v_colnum 是前边传来的表和字段列的信息
    ……
    execute immediate sql_str using v_ei2(i+1),v_starttime;
    v_ei2(i+1),v_starttime 分别用来替换 (:1)\(:2)
    希望你能尽快解决!
      

  4.   

    应该是锁了,要不没这么久,v$locked_objects看看;
      

  5.   

    select * from v$locked_object
    不好意思,刚才多了个S字符