UPDATE product_ranking pfr SET pfr.related_product_id1=  
 SELECT p0.product_id FROM ( 
 SELECT * FROM product_ranking p0 order by dbms_random.value() ) p0
 WHERE p0.supplier_id=pfr.supplier_id AND p0.product_id!=pfr.product_id and rownum=1;  这个SQL,可以执行,可是因为table product_ranking 的数据太大(超过900,000),很慢,
怎么办??

解决方案 »

  1.   

    product_ranking 表的字段related_product_id1,product_id ,supplier_id 加上index呢? 
      

  2.   

    呵呵,gelyon 是斑竹吗?好敬业哦:-)这个不懂呢,不过即使可以,也是最后的选择,数据太大, index 也太大吧?我在考虑把condition 移到里面内循环,UPDATE product_ranking pfr SET pfr.related_product_id1=  
    (
     SELECT pk.product_id FROM ( 
     SELECT  p0.supplier_id,p0.product_id FROM product_ranking p0 
      WHERE p0.supplier_id=pfr.supplier_id 
      AND p0.product_id!=pfr.product_id   order by dbms_random.value() 
    ) pk
    where rownum=1
    )可是出现这样的err :[1]: (Error): ORA-00904: "PFR"."PRODUCT_ID": invalid identifier说明 内层根本不认识 pfr ???? 
      

  3.   


    呵呵 我不是斑竹
    由于你有三层,最外层的值传不到最内层,因此pfr.product_id  会无法识别
      

  4.   

    至于为什么 ,请看着这个http://topic.csdn.net/u/20101025/10/653891e9-8577-4fde-904f-dde218b48115.html?30141呵呵,不管怎样感谢大家的热心哦^_^
      

  5.   

    --试试先过率不必要的 p0.product_id!=pfr.product_id 位置至于前面
    --建关联字段的索引看看
    UPDATE product_ranking pfr SET pfr.related_product_id1=(SELECT p0.product_id 
    FROM (SELECT supplier_id,product_id FROM product_ranking order by dbms_random.value()) p0
    WHERE p0.product_id!=pfr.product_id and p0.supplier_id=pfr.supplier_id AND  rownum=1)
      

  6.   

    还是 我说的,你内层随机获取的这个查询,走全表扫描是避免不到的,如何在外层更快点,那么你最好对
    product_ranking 表的字段related_product_id1,product_id ,supplier_id 加上index
    related_product_id1要单独建index,
    supplier_id, product_id 建一个联合index,
    这样做了你再试下另外,你可以结合执行计划一起看,是否需要优化,怎么优化,看执行计划怎么走的!
      

  7.   

    这样试试
    1)使用ceate table as .... order by dbms_random.vlaue()建立一张新表。
    2)在相关条件字段上建立索引。
    3)关联取得数据。
      

  8.   

    谢谢各位, 大家说的办法都不错,可能都会加快速度,
    刚刚跟DBA 讨论了一下,他是建议先用procedure试试看, 因为之前上面那段本来是直接在java 里跑的
      

  9.   

    Hi gelyon, 再请教,你所说的“字段related_product_id1,product_id ,supplier_id 加上index”, 是为了加快外层的速度对吗?
    但是,这段code 之所以速度变慢就是因为randomize(内层),这样提高外层速度有效么?可以说一下加另外两个index的理由吗? 谢谢先:P