【发布时间】:2014-10-29 19:20:56
【问题描述】:
我正在使用 Oracle 版本 > 10gR2。 我有一张有 2000 万条记录的表。我想在将所有记录导出到文件之前对其进行处理,但是这样做的速度很慢。
你有什么建议吗?以下是我的代码:
declare
l_temp_detail clob := null;
icount number:=0;
cursor c_test is
select /*+ PARALLEL(12) */ *
from test_table t;
TYPE t_test IS TABLE OF test_table%ROWTYPE INDEX BY PLS_INTEGER;
l_test_items t_test;
BEGIN
l_temp_detail := '';
OPEN c_test;
LOOP
FETCH c_test
BULK COLLECT INTO l_test_items LIMIT 25000;
EXIT WHEN l_test_items.COUNT = 0;
FOR i in l_test_items.first .. l_test_items.last LOOP
icount := icount+1;
--doing business here
l_temp_detail := ....
END LOOP;
dbms_output.put_line(to_char(icount));
END LOOP;
CLOSE c_test;
END;
【问题讨论】:
-
你在做什么来“处理”数据?您确定不能在 SQL 中进行该处理吗?如果您要编写单线程代码来处理结果,则并行提示似乎毫无意义。根据 Oracle 版本,您可能能够使用
dbms_parallel_execute并行处理,但如果不知道您的处理究竟由什么组成,就很难知道。如果您的处理涉及某种 DML,FORALL循环将比FOR更有效。 -
慢了多少?批量收集还不错,正如贾斯汀所说,你当然可以用 FORALL 来改进它。看到这个:oracle.com/technetwork/issue-archive/2012/12-sep/…
-
因此您正在读取 2000 万行并将结果放入 CLOB,然后将结果写入文件。您是否在写入文件之前将所有 2000 万行数据放入 CLOB?我想知道减速在哪里。如果您的问题中的查询代表真正正在做的事情,那么查询并没有做太多,所以减速必须在其他地方。您是否尝试过使用分析器来确定代码在哪里花费时间?我认为这可能是一个很好的下一步。祝你好运。
-
个人资料!轮廓 !个人资料!