SQL文如下:
UPDATE tableA
   SET FLAG = 1
 WHERE FLAG <> 1
   AND fieldA NOT IN 
       (SELECT substr(fieldA,1,8)||max(substr(fieldA,9,2))
          FROM tableA
         GROUP BY substr(fieldA,1,8)) 他的功能是,将表A中的若干条记录的flag设置成1,条件是:
如果该表中fieldA列的值的前8位相同,那么将后两位中不是最大的纪录进行设置,
举个例子:
如果fieldA的值有AAAAAAAA01,AAAAAAAA02,AAAAAAAA03,
那么将AAAAAAAA01,AAAAAAAA02对应的纪录的flag进行设置。
现在表A中有两万条数据,上述sql文执行需要6分钟,怎么才能提高效率呢。谢谢!

解决方案 »

  1.   

    flag上建立bitmap索引,将flag<>1改为 flag > 1 || flag < 1
      

  2.   

    UPDATE tableA a
       SET FLAG = 1
     WHERE FLAG <> 1
       AND NOT EXISTS
           (SELECT 1
              FROM tableA b
              where a.fieldA=substr(b.fieldA,1,8)||max(substr(b.fieldA,9,2))
             GROUP BY substr(fieldA,1,8)) 
    试试吧
      

  3.   

    1.explain plan你的sql语句
    UPDATE tableA
       SET FLAG = 1
     WHERE FLAG <> 1
       AND fieldA NOT IN 
           (SELECT substr(fieldA,1,8)||max(substr(fieldA,9,2))
              FROM tableA
             GROUP BY substr(fieldA,1,8)) 
    看看到底那里cost比较大,问题出在哪里2.tableA的FLAGH和fieldA字段有没有作过index?没有就加index
    3 not in 和not exists不是一定说哪个更快,不能一概而论,有时候是not in快,有时候是not exists快,有时候一样快,关键还是要看执行计划,不能人云亦云