一个很基本的问题
我循环执行update操作用于更新一张表的一个字段值。(update table xxx set xxx=xxx where xxx=xxx)
但是325条记录用了961秒钟的时间,比平时慢了许多。
我不知道如何去监测这张表的性能以及出现这种情况可能的原因。
请高手指点。
谢谢!

解决方案 »

  1.   

    单独执行一条update要多长时间,表上是否有索引,表的总数据量有多大。是在pl/sql执行的吧?按F5查看一条update的执行计划。
      

  2.   

    尽量不要写pl/sql来循环更新
    使用update批量更新
      

  3.   

    select b.username username,
           a.DISK_READS reads,
           a.EXECUTIONS exec,
           a.DISK_READS / (decode(a.EXECUTIONS, 0, 1, a.EXECUTIONS)) rds_exec_ratio,
           a.SQL_TEXT statement
      from v$sqlarea a, dba_users b
     where a.PARSING_USER_ID = b.user_id
       and a.DISK_READS > 100000
     order by a.DISK_READS desc;--这里面查到的比较靠前的记录一般都是有问题的sql语句。
    查询占用资源的sql很多,在网上可以搜搜。
      

  4.   

    估计是没有绑定变量,update语句被解析了325次。
      

  5.   

    我刷新时编写了一个存储过程如下:
    create or replace procedure update_equip_obj_pos is  CURSOR body_vol_id IS
        select e.aa,e.vstring from a1 e;  v_key_code   VARCHAR2(1000);  v_pos    VARCHAR2(1000);
    begin
      for curr_vol_id in body_vol_id loop
        v_key_code   := curr_vol_id.aa;    v_pos    := curr_vol_id.vstring;update equipment_object_tab t set t.MCH_POS = v_pos  where t.mch_code = v_key_code;
    commit;  end loop;end update_equip_obj_pos;其中a1是一个临时表,因为别人给我的记录是excel格式的,我会先把相关的列拷贝到临时表里。
    然后,equipment_object_tab 表的索引有mch_code 这个字段,这个表总共有记录281427条。
      

  6.   

    把commit发在end loop的后面 这样效率应该好很多
    还有最好加上exception异常处理