运行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?这会是什么样的?
在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中创建自己的并行性要快。以下是一些需要注意的事项:
/*+ parallel */
可让Oracle决定,但您可能希望通过指定一个数字来解决它,例如/*+ parallel(8) */
。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并行性可能很棘手,但如果你小心的话,它也可以使你的进程运行速度提高几个数量级。
如果客观是快速加载,并行只是尝试得到那么做。
Create table newtemp as select old
要创建表。
然后
Create table old_remaning as select old with not exists newtemp
然后删除旧表和新表。然后重命名表。这些操作将在db级别使用并行选项