gpt4 book ai didi

oracle - 优化Oracle 11g程序

转载 作者:行者123 更新时间:2023-12-03 17:05:15 26 4
gpt4 key购买 nike

我有一个过程可以在一个非常大的表中找到一系列交易的起价,最高价和最低价,该表按日期,对象名称和代码进行组织。我还需要交易的总和。表中大约有30亿行,此过程需要很多天才能运行。我想尽可能减少时间。我在trans表中的不同字段上都有一个索引,然后在查询的选择部分上查看解释计划,正在使用该索引。我愿意就替代方法提出建议。我使用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;

最佳答案

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;



通常,单个SQL语句要比多个SQL语句快得多。它们有时需要更多的资源,例如更多的临时表空间,但是无论如何,您独特的光标可能已经在对磁盘上的整个表进行排序。
您可能还希望启用并行DML和并行查询,尽管这可能已经发生,具体取决于您的对象和系统设置。 (根据您的资源,这不一定是一件好事,但这通常可以帮助进行大型查询。)
如果SQL写入大量数据,则并行写入和APPEND应该会提高性能,但这也意味着新表在下一次备份之前是不可恢复的。 (并行DML将自动使用直接路径写入,但是无论如何我通常都会包含APPEND,以防并行性无法正常工作。)


即使对于这么小的查询,也有很多要考虑的地方,但这就是我要开始的地方。

关于oracle - 优化Oracle 11g程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8681368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com