我有一個程序,可以根據日期,對象名稱和代碼來組織一個非常大的表中的一系列事務的第一個,最後一個,最大和最小价格。我還需要交易數量的總和。表中約有30億行,這個過程需要很多天才能運行。我想盡可能地減少這個時間。我在變換表中的不同字段上有一個索引,並在查詢的選定部分查看解釋計劃,正在使用該索引。我樂於接受其他方法的建議。我使用Oracle 11g R2。謝謝。優化Oracle 11g程序
declare
cursor c_iter is select distinct dt, obj, cd from trans;
r_iter c_iter%ROWTYPE;
v_fir number(15,8);
v_las number(15,8);
v_max number(15,8);
v_min number(15,8);
v_tot number;
begin
open c_iter;
loop
fetch c_iter into r_iter;
exit when c_iter%NOTFOUND;
select max(fir), max(las) into v_fir, v_las
from
(select
first_value(prc) over (order by seq) as "FIR",
first_value(prc) over (order by seq desc) as "LAS"
from trans
where dt = r_iter.DT and obj = r_iter.OBJ and cd = r_iter.CD);
select max(prc), min(prc), sum(qty) into v_max, v_min, v_tot
from trans
where dt = r_iter.DT and obj = r_iter.OBJ and cd = r_iter.CD;
insert into stats (obj, dt, cd, fir, las, max, min, tot)
values (r_iter.OBJ, r_iter.DT, r_iter.CD, v_fir, v_las, v_max, v_min, v_tot);
commit;
end loop;
close c_iter;
end;
謝謝你這是一個非常優雅的解決方案。我會按照當前的腳本計時,並報告回來。 – 2011-12-30 19:03:40
這個sql在3個小時內運行了3天。我非常驚訝。十分感謝你的幫助。你做諮詢嗎? – 2011-12-31 20:34:40
請注意,並行查詢僅在企業版中許可。這也不是銀彈。 – APC 2012-01-02 10:17:22