我必须从某些表中生成一些百万更新,以更新自己。我刚刚学习了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
将其替换为一系列数字,但有人可以解释导致这种情况的原因(我可以对它做些什么吗? )?
提前致谢!
答案 0 :(得分:8)
序列可能是一个瓶颈,特别是当多个会话/线程同时使用它们时。
您可以采取的主要措施是增加缓存的序列值的数量:ALTER SEQUENCE CACHE n
,将n
替换为大于20的值(默认值)。我建议将其设置得更高,因为您将在一个语句中使用许多或所有序列值。你可以高达(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
。