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),很慢,
怎么办??
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),很慢,
怎么办??
(
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 ????
呵呵 我不是斑竹
由于你有三层,最外层的值传不到最内层,因此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)
product_ranking 表的字段related_product_id1,product_id ,supplier_id 加上index
related_product_id1要单独建index,
supplier_id, product_id 建一个联合index,
这样做了你再试下另外,你可以结合执行计划一起看,是否需要优化,怎么优化,看执行计划怎么走的!
1)使用ceate table as .... order by dbms_random.vlaue()建立一张新表。
2)在相关条件字段上建立索引。
3)关联取得数据。
刚刚跟DBA 讨论了一下,他是建议先用procedure试试看, 因为之前上面那段本来是直接在java 里跑的
但是,这段code 之所以速度变慢就是因为randomize(内层),这样提高外层速度有效么?可以说一下加另外两个index的理由吗? 谢谢先:P