我刚刚使用Oracle,我写了一条update语句执行起来很慢UPDATE new_staff_info
   SET add_ = 1
 WHERE staff_id IN (1286, 1290, 1293, 1301, 1304, 1308)这样写有什么问题吗?

解决方案 »

  1.   

    1000条数据就不应该了~
    staff_id 应该是你的主键吧?
    analyze table new_staff_info  compute statistics;
    统计一下new_staff_info  表的表信息,看看
      

  2.   

    这已经是最简单的SQL了,如果有问题就不知道为什么了,除非现场调试。
    另问new_staff_info这张表有没有触发器啊?如果add_与其他表有关联也有可能出问题的。
      

  3.   

    UPDATE (SELECT * FROM new_staff_info WHERE staff_id IN (1286, 1290, 1293, 1301, 1304, 1308)) 
      SET add_ = 1;这样写试试.如果还慢,那试试
    SELECT * FROM new_staff_info WHERE staff_id IN (1286, 1290, 1293, 1301, 1304, 1308);
    这句的速度.看看执行计划
    EXPLAIN PLAN FOR 
    SELECT * FROM new_staff_info WHERE staff_id IN (1286, 1290, 1293, 1301, 1304, 1308);SELECT plan_table_output
     FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
      

  4.   

    你可以尝试讲IN替换成EXISTS,网上这样的例子多了,那样能提高效率!
      

  5.   


    第一将IN改成exists吧
    问下IN(1286, 1290, 1293, 1301, 1304, 1308)这里的值有多少个?如果比较多的话,全部是硬解析,每次都很消耗资源的,这样update的数据量一多的话,就会很慢的;比方说你有2000条记录要修改,而IN里面有300个需要匹配的值,那么表扫描次数就是300x2000,效率多慢啊。用exists(select 1 from tablename where ....)好了,我相信你IN里面的数据也是从表里取的吧,写个条件判断应该很好实现的吧!