代码之家  ›  专栏  ›  技术社区  ›  Zsolt Botykai

带序列的SQL(PLUS)性能

  •  1
  • Zsolt Botykai  · 技术社区  · 14 年前

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

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

    (我是这样做的,因为它给了我更新中的备份数据。我老板让我这样做;—)

    所以当在 set id = 1 在PLSQL开发人员中。

    但后来我把它写进了一个文件,并插入了一个 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 回复  |  直到 14 年前
        1
  •  8
  •   Dave Costa    14 年前

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

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