У меня есть процедура поиска первых, последних, максимальных и минимальных цен для серии транзакций в очень большой таблице, которая организована по дате, имени объекта и коду. Мне также нужна сумма транзакций. В таблице около 3 миллиардов строк, и для выполнения этой процедуры требуется много дней. Я хотел бы сократить это время как можно больше. У меня есть индекс на отдельных полях в таблице trans, и, глядя на план объяснения на выбранную часть запросов, используется индекс. Я открыт для предложений по альтернативному подходу. Я использую 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;
спасибо, что это очень изящное решение. я запустим процедуру против текущего скрипта и отчитаюсь. –
этот sql пробежал через 3 часа по сравнению с 3 днями. я совершенно удивлен. Большое вам спасибо за помощь. вы консультируетесь? –
Обратите внимание, что параллельный запрос лицензируется только в Enterprise Edition. Это также не серебряная пуля. – APC