带序列的SQL(加)性能

时间:2010-10-13 20:36:34

标签: performance oracle plsql code-generation sequence

我必须从某些表中生成一些百万更新,以更新自己。我刚刚学习了parallel(tablename,threads),当我运行这样的东西时,它真正改善了PLSQL开发人员的性能:

select /* + parallel(table1,100) parallel(table2,100) */
       'update table1 set id = 1 where ... and id = '||table1.id||' ...
where ...

(我这样做,因为它在更新中提供了备份数据。我的BOSS告诉我这样做; - )

因此,在set id = 1部分和PLSQL Developer中使用静态数字时,它确实很快。

但后来我将其写入文件,并在之前插入create sequence,并尝试按如下方式使用该序列:

create sequence myseq
 start with   4200000
 increment by 1
 maxvalue     11200000;


select /* + parallel(table1,100) parallel(table2,100) */
       'update table1 set id = '||myseq.nextval||' where ... and id = '||table1.id||' ...
where ...

但是现在它非常缓慢。我不知道为什么。我刚刚重新编写了update生成器,在那里插入静态数据,并使用awk将其替换为一系列数字,但有人可以解释导致这种情况的原因(我可以对它做些什么吗? )?

提前致谢!

1 个答案:

答案 0 :(得分:8)

序列可能是一个瓶颈,特别是当多个会话/线程同时使用它们时。

您可以采取的主要措施是增加缓存的序列值的数量:ALTER SEQUENCE CACHE n,将n替换为大于20的值(默认值)。我建议将其设置得更高,因为您将在一个语句中使用许多或所有序列值。你可以高达(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)