我必须从一些表中生成数百万个更新,以更新它们自己。我最近才了解到parallel(tablename,threads),当我运行下面的代码时,它确实提高了PLSQL developer的性能:
select /* + parallel(table1,100) parallel(table2,100) */
'update table1 set id = 1 where ... and id = '||table1.id||' ...
where ...(我这样做是因为它为我提供了更新中的备份数据。我的老板让我这样做;-)
因此,在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将其替换为一个数字序列,但是谁能解释一下是什么导致了这种情况(我能做点什么吗)?
提前感谢!
发布于 2010-10-14 06:24:15
序列可能是一个相当大的瓶颈,特别是当多个会话/线程同时使用它们时。
要改进这一点,您可以做的主要事情是增加缓存的序列值的数量:ALTER SEQUENCE CACHE n,用一个大于20 (默认值)的值替换n。我建议将其设置得更高,因为您将在一条语句中使用许多或所有序列值。你可以达到(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)的高度。
https://stackoverflow.com/questions/3927785
复制相似问题