Performance SQL(plus)性能与序列

Performance SQL(plus)性能与序列,performance,oracle,plsql,code-generation,sequence,Performance,Oracle,Plsql,Code Generation,Sequence,我必须从某个表中生成大约一百万个更新,以更新它们自己。我最近刚刚了解了parallel(tablename,threads),当我运行类似这样的程序时,它确实提高了PLSQL developer的性能: select /* + parallel(table1,100) parallel(table2,100) */ 'update table1 set id = 1 where ... and id = '||table1.id||' ... where ... (我是这样做的,

我必须从某个表中生成大约一百万个更新,以更新它们自己。我最近刚刚了解了
parallel(tablename,threads)
,当我运行类似这样的程序时,它确实提高了PLSQL developer的性能:

select /* + parallel(table1,100) parallel(table2,100) */
       'update table1 set id = 1 where ... and id = '||table1.id||' ...
where ...
(我是这样做的,因为它会在更新中为我提供备份数据。我的老板让我这样做;-))

因此,在
setid=1
部分和plsqldeveloper中使用静态数字时,它的工作速度非常快

但随后我将其写入了一个文件,并在前面插入了一个
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
将其替换为一系列数字,但有人能解释一下是什么导致了这一情况(我能做些什么吗)


提前谢谢

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


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

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


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

+1。除了试图使序列更好地与多线程协同工作外,您是否考虑过使用更少的并行性?为什么使用100而不是Oracle默认值?如果您的查询有任何分组或排序,那么实际上可能使用了200个会话。(检查v$px_进程以查看您正在使用多少并行会话)。你的数据库有几十个内核和磁盘吗?谢谢你的回答Dave(和你们所有人)。我在一个测试服务器上,有16 GB RAM和16个内核。还有几个磁盘。我所做的是不按顺序运行查询,并在5分钟内完成(将输出假脱机到文件中)。然后添加序列,使用c
CACHE 20000
并通过
watch-d wc-l output.sql
监视输出的行增长。5分钟后,它仍然显示了约1000行,这意味着它只使用了约150行。除了试图使序列更好地与多线程协同工作外,您是否考虑过使用更少的并行性?为什么使用100而不是Oracle默认值?如果您的查询有任何分组或排序,那么实际上可能使用了200个会话。(检查v$px_进程以查看您正在使用多少并行会话)。你的数据库有几十个内核和磁盘吗?谢谢你的回答Dave(和你们所有人)。我在一个测试服务器上,有16 GB RAM和16个内核。还有几个磁盘。我所做的是不按顺序运行查询,并在5分钟内完成(将输出假脱机到文件中)。然后添加序列,使用c
CACHE 20000
并通过
watch-d wc-l output.sql
监视输出的行增长。5分钟后,它仍然显示了约1000行,这意味着它只使用了约150行。