带序列的SQL(加)性能

Zso*_*kai 1 oracle performance plsql code-generation sequence

我必须从某些表中生成一些百万更新,以更新自己.我最近刚刚了解到parallel(tablename,threads),当我运行这样的东西时,PLIS开发人员的性能真正得到了改善:

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

(我这样做,因为它在更新时给了我备份数据.我的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 ...
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Dav*_*sta 8

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

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

  • +1.除了尝试使用多个线程使序列更好地工作之外,您是否考虑过使用较少的并行性?为什么使用100而不是Oracle默认值?如果您的查询有任何分组或排序,您实际上可能正在使用200个会话.(检查v $ px_process以查看您正在使用的并行会话数).您的数据库是否有几十个核心和磁盘? (2认同)