ant*_*_ml 2 oracle optimization stored-procedures vldb oracle11g
我有一个程序来查找一个非常大的表中的一系列事务的第一个,最后一个,最大和最小价格,该表按日期,对象名称和代码组织.我还需要交易数量的总和.表中大约有30亿行,此过程需要很多天才能运行.我想尽可能减少时间.我有一个关于trans表中的distinct字段的索引,并查看查询的select部分的解释计划,正在使用索引.我对另一种方法的建议持开放态度.我使用的是Oracle 11g R2.谢谢.
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;
Run Code Online (Sandbox Code Playgroud)
alter session enable parallel dml;
insert /*+ append parallel(stats)*/
into stats(obj, dt, cd, fir, las, max, min, tot)
select /*+ parallel(trans) */ obj, dt, cd
,max(prc) keep (dense_rank first order by seq) fir
,max(prc) keep (dense_rank first order by seq desc) las
,max(prc) max, min(prc) min, sum(qty) tot
from trans
group by obj, dt, cd;
commit;
Run Code Online (Sandbox Code Playgroud)
有很多东西要考虑,即使是这么小的查询,但这是我开始的地方.
| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |