P
Parallel processing demo:
Prepare data for processing:
--DROP TABLE test_par PURGE;
CREATE TABLE test_par (
id NUMBER PRIMARY KEY,
order# NUMBER,
session_id NUMBER
);
--
TRUNCATE TABLE test_par;
--
INSERT INTO test_par (id, order#)
SELECT LEVEL, LEVEL
FROM DUAL
CONNECT BY LEVEL <= 100000;
--
COMMIT;
Process data in chunks:
DECLARE
in_threads CONSTANT NUMBER := 8;
in_chunk_size CONSTANT NUMBER := 15000;
--
l_task_name VARCHAR2(64) := 'test_par#' || TO_CHAR(SYSDATE, 'HH24MISS');
l_exec VARCHAR2(32000);
l_try PLS_INTEGER := 0;
l_status PLS_INTEGER;
BEGIN
UPDATE test_par SET session_id = NULL;
--
DBMS_PARALLEL_EXECUTE.CREATE_TASK(task_name => l_task_name, comment => '');
DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID (
task_name => l_task_name,
table_owner => USER,
table_name => 'TEST_PAR',
by_row => TRUE,
chunk_size => in_chunk_size
);
--
l_exec := 'UPDATE test_par t
SET t.session_id = SYS_CONTEXT(''USERENV'', ''SESSIONID'')
WHERE ROWID BETWEEN :start_id AND :end_id';
--
DBMS_PARALLEL_EXECUTE.RUN_TASK (
task_name => l_task_name,
sql_stmt => l_exec,
language_flag => DBMS_SQL.NATIVE,
parallel_level => in_threads
);
--
l_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS(l_task_name);
--
WHILE l_try < 2 AND l_status != DBMS_PARALLEL_EXECUTE.FINISHED LOOP
DBMS_PARALLEL_EXECUTE.RESUME_TASK(l_task_name);
--
l_status := DBMS_PARALLEL_EXECUTE.task_status(l_task_name);
l_try := l_try + 1;
END LOOP;
--
DBMS_PARALLEL_EXECUTE.DROP_TASK(l_task_name);
DBMS_OUTPUT.PUT_LINE('DONE');
--
COMMIT;
END;
/
Check progress from another session:
SELECT t.* FROM user_parallel_execute_tasks t; -- SELECT p.* FROM user_parallel_execute_chunks p ORDER BY 1 DESC;
Check results:
SELECT session_id, COUNT(*) FROM test_par GROUP BY session_id ORDER BY session_id;
Cleanup:
DROP TABLE test_par PURGE;
Comments
Post a Comment