Oracle 11G R2的dbms_parallel_execute

abstractcyj發表於2015-05-14
並行DML是讓批量DML加速的一種非常強大的方法。然而,在單個事務中應用所有的變更也是有缺點的。這會導致長時間的鎖,要求大量的回滾段,而且當操作失敗時,將帶來昂貴的回滾操作的風險。

在Oracle 11gR2中引入的DBMS_PARALLEL_EXECUTE幫助解決了這個難題。它允許用更小的”塊“來執行並行DML,且每個塊都可以獨立提交。任何一個單獨的塊操作發生失敗時,包支援重新啟動這個任務。

DECLARE
  v_stmt     VARCHAR2(2000);
  v_taskname VARCHAR2(200) := 'my parallel task demo3';


  v_status NUMBER;
BEGIN
  dbms_parallel_execute.create_task(task_name => v_taskname,
                                    COMMENT   => 'demo');
  dbms_parallel_execute.create_chunks_by_rowid(task_name   => v_taskname,
                                               table_owner => USER,
                                               table_name  => 'TEST_SALES',
                                               by_row      => TRUE,
                                               chunk_size  => 100);


  v_stmt := 'update TEST_SALES set amount_sold = amount_sold*10 where rowid between :start_id and :end_id ';
  --這裡的繫結變數佔位符:start_id與end_id都不能隨意替換成其他標識
  dbms_parallel_execute.run_task(task_name      => v_taskname,
                                 sql_stmt       => v_stmt,
                                 language_flag  => dbms_sql.native,
                                 parallel_level => 4);


  v_status := dbms_parallel_execute.task_status(task_name => v_taskname);


  IF v_status = dbms_parallel_execute.finished THEN
    dbms_parallel_execute.drop_task(task_name => v_taskname);
  ELSE
    dbms_parallel_execute.drop_task(task_name => v_taskname);
    raise_application_error(-20001,
                            v_taskname || ' finished with error!!!',
                            TRUE);
  END IF;
END;


摘自:Oracle效能優化求生指南

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8520577/viewspace-1654881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章