并行运行PLSQL

问题描述 投票:1回答:2

运行PLSQL脚本以生成负载

由于某些原因(重现错误,......)我想在PL SQL脚本中生成一些负载(具有特定的操作)。

我想做什么: A)在Schema A表1中插入1.000.000行

B)在循环中并且最好并行(2或3次)

1) read from Schema-A.Table-1 one row with locking  
2) insert it to Schema-B.Table-2   
3) delete row from Schema-A.Table-1  

有没有办法在调用脚本的PLSQL中并行执行脚本中的B-task?这会是什么样的?

oracle plsql
2个回答
0
投票

在PL / SQL块中并行化SQL语句通常更好,而不是尝试并行化整个PL / SQL块:

begin
    execute immediate 'alter session enable parallel dml';

    insert /*+ append parallel */ into schemaA.Table1 ...
    commit;

    insert /*+ append parallel */ into schemaB.Table2 ...
    commit;

    delete /*+ parallel */ from schemaA.Table1 where ...
    commit;

    dbms_stats.gather_table_stats('SCHEMAA', 'TABLE1', degree => 8);
    dbms_stats.gather_table_stats('SCHEMAB', 'TABLE2', degree => 8);
end;
/

大型并行DML语句通常需要的代码更少,运行速度比在PL / SQL中创建自己的并行性要快。以下是一些需要注意的事项:

  1. 您必须具有Enterprise Edition,大型表,合适的硬件和合理的配置才能运行并行SQL。
  2. 设置DOP很困难。使用提示/*+ parallel */可让Oracle决定,但您可能希望通过指定一个数字来解决它,例如/*+ parallel(8) */
  3. 直接路径写入(附加提示)可以明显更快。但是他们会锁定整个表格,并且在下次备份之前,新结果将无法恢复。
  4. 检查执行计划以确保使用直接路径写入 - 查找操作LOAD AS SELECT而不是LOAD TABLE CONVENTIONAL。调优并行SQL语句最好使用select dbms_sqltune.report_sql_monitor(sql_id => 'SQL_ID') from dual;中的Real-Time SQL Monitoring报告

您可能需要阅读本手册的Parallel Execution Concepts章节。 Oracle并行性可能很棘手,但如果你小心的话,它也可以使你的进程运行速度提高几个数量级。


0
投票

如果客观是快速加载,并行只是尝试得到那么做。

Create table newtemp as select old

要创建表。

然后

Create table old_remaning as select old with not exists newtemp

然后删除旧表和新表。然后重命名表。这些操作将在db级别使用并行选项

© www.soinside.com 2019 - 2024. All rights reserved.