2. Caso de procesamiento paralelo del método de división ROWID
2.1. Crear trabajos de procesamiento paralelo con particiones ROWID
CREAR_TAREA( ) para crear la tarea.
-- 1단계: 작업생성
BEGIN
DBMS_PARALLEL_EXECUTE.CREATE_TASK(TASK_NAME => 'DPE_TEST(BY ROWID)');
END;
/
El resultado de la creación del trabajo se puede comprobar de la siguiente manera.
-- 작업 생성 확인
SELECT * FROM USER_PARALLEL_EXECUTE_TASKS;
A partir del resultado anterior, se puede confirmar que la Tarea se ha creado y el ESTADO es CREADO.
Como referencia, el ESTADO de una tarea tiene valores de CHUNKED, CHUNKING, CHUNKING_FAILED, CRASHED, CREATED, FINISHED, FINISHED_WITH_ERROR, PROCESSING, y cada significado es el siguiente.
CHUNKED: fragmento creado, aún no asignado a una tarea
CHUNKING: creando trozos
CHUNKING_FAILED: Error al crear fragmento
CRASHED: se produjo un bloqueo de la base de datos o del proceso del trabajo durante la ejecución de la tarea y el error no se registró ni finalizó.
RELACIONADO: Tarea creada (todavía no se ha creado ningún fragmento)
FINALIZADO: todos los fragmentos completados sin errores
FINISHED_WITH_ERROR: Todos los fragmentos se completaron, pero ocurrieron algunos errores
PROCESANDO: Tosk ha comenzado a ejecutarse, algunos de los fragmentos están en progreso o completos
es un tipo BOOLEAN, si es VERDADERO significa recuento de filas y FALSO significa recuento de bloques.
Ejecute lo siguiente para crear fragmentos que dividan el recuento de filas de la tabla Z_DPE_TEST_TAB en 10 000 filas.
-- 2단계: 작업 단위 분할
BEGIN
DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID(TASK_NAME => 'DPE_TEST(BY ROWID)',
TABLE_OWNER => USER,
TABLE_NAME => 'Z_DPE_TEST_TAB',
BY_ROW => TRUE,
CHUNK_SIZE => 10000);
END;
/
Comprobemos el estado de división de la unidad de trabajo.
-- 작업 분할 상태 확인
SELECT *
FROM USER_PARALLEL_EXECUTE_CHUNKS
WHERE TASK_NAME = 'DPE_TEST(BY ROWID)';
Se puede confirmar que el ESTADO de cada fragmento en el momento de la división es SIN ASIGNAR. Como referencia, el ESTADO del fragmento tiene valores de NO ASIGNADO, ASIGNADO, PROCESADO y PROCESADO_CON_ERROR, y cada significado es el siguiente.
SIN ASIGNAR: fragmento creado, aún no asignado a una tarea
ASIGNADO: el fragmento se asigna a la tarea y se ejecuta
PROCESADO: La operación se completó sin errores
PROCESSED_WITH_ERROR: La operación se completó, pero ocurrió un error durante la ejecución
Aquí, LANGUAGE_FLAG significa la versión estándar para que Oracle procese SQL_STMT, y DBMS_SQL.NATIVE se puede usar como predeterminado.
Como referencia, el contenido del Documento de Oracle es el siguiente:
V6 (o 0) especifica el comportamiento de la versión 6
NATIVO (o 1) especifica el comportamiento normal de la base de datos a la que está conectado el programa
V7 (o 2) especifica el comportamiento de la versión 7 de la base de datos de Oracle
PARALLEL_LEVEL significa el número de trabajos a ejecutar simultáneamente, es decir, el grado de paralelismo (DOP), y puede ser igual o menor que el número de trozos, que son unidades de trabajo. En el mismo caso, un trabajo procesa un fragmento y, en un caso pequeño, un trabajo procesa varios fragmentos.
-- 동시 실행현황 확인: 작업 실행전
SELECT AUDSID, COUNT(*)
FROM Z_DPE_TEST_TAB
GROUP BY AUDSID
ORDER BY AUDSID;
Si verifica el COUNT para cada AUDSID antes de ejecutar la tarea, puede ver que todos los datos están configurados como nulos y aún no se han ejecutado.
Ahora vamos a ejecutar el trabajo.
-- 3단계: 작업 실행
DECLARE
L_SQL_STMT VARCHAR2(32767);
BEGIN
L_SQL_STMT := 'UPDATE Z_DPE_TEST_TAB
SET VAL = ROUND(DBMS_RANDOM.VALUE(1,10000))
,AUDSID = SYS_CONTEXT(''USERENV'',''SESSIONID'')
WHERE ROWID BETWEEN :START_ID AND :END_ID';
DBMS_PARALLEL_EXECUTE.RUN_TASK(TASK_NAME => 'DPE_TEST(BY ROWID)',
SQL_STMT => L_SQL_STMT,
LANGUAGE_FLAG => DBMS_SQL.NATIVE,
PARALLEL_LEVEL => 10);
END;
/
El SQL ejecutado especifica el ámbito de ejecución con dos variables de vinculación: START_ID y: END_ID. Si este nombre de variable se usa de manera diferente, se producirá un error, así que asegúrese de usar este nombre.
El SQL ejecutado aquí se escribe para verificar qué sesión actualizó la fila actual actualizando un valor aleatorio en la columna VAL y actualizando el valor actual de SESSIONID en la columna AUDSID para realizar pruebas.
Como referencia, la columna AUDSID tiene el mismo significado que V$SESSION.AUDSID. Si cada operación de unidad de fragmento lleva mucho tiempo, la supervisión de la sesión se puede realizar consultando V$SESSION con AUDSID.
Si ejecuta el siguiente SQL durante la ejecución, puede verificar cuántas filas se actualizan en cuántas sesiones.
-- 동시 실행현황 확인: 작업 실행중
SELECT AUDSID, COUNT(*)
FROM Z_DPE_TEST_TAB
GROUP BY AUDSID
ORDER BY AUDSID;
Comprobemos el progreso de cada bloque en el que se divide el trabajo, no la unidad de sesión.
-- 작업의 Chunk별 진행상황/완료 확인
SELECT *
FROM USER_PARALLEL_EXECUTE_CHUNKS
WHERE TASK_NAME = 'DPE_TEST(BY ROWID)';
En el resultado anterior, puede ver que ESTADO cambia a PROCESADO y se administran START_TS (hora de inicio) y END_TS (hora de finalización).
Para verificar el progreso por estado de fragmento, ejecute el siguiente SQL.
-- Chunk의 상태별 진행상황
SELECT STATUS, COUNT(*)
FROM USER_PARALLEL_EXECUTE_CHUNKS
WHERE TASK_NAME = 'DPE_TEST(BY ROWID)'
GROUP BY STATUS;
Del resultado anterior, se puede confirmar que se han completado 172 fragmentos en estado PROCESADO. Dado que la imagen se capturó después de completar el trabajo, solo se registró un estado. Si la operación lleva mucho tiempo, puede verificar la cantidad de fragmentos para cada estado.
2.4. Confirmar la finalización de la tarea y eliminar
DROP_TAREA( ) para eliminar el trabajo.
Como referencia, si no lo elimina, se producirá un error ORA-29497: nombre de tarea duplicado (DUPLICATE_TASK_NAME) al crear una tarea con el mismo TASK_NAME más tarde.
-- 작업 완료 확인
SELECT *
FROM USER_PARALLEL_EXECUTE_TASKS;
A partir del resultado anterior, se puede confirmar que el ESTADO de la tarea se ha completado con FINALIZADO.
-- 4단계: 작업 완료 확인 및 작업 삭제
BEGIN
DBMS_PARALLEL_EXECUTE.DROP_TASK(TASK_NAME => 'DPE_TEST(BY ROWID)');
END;
/
Si revisa la vista USER_PARALLEL_EXECUTE_TASKS nuevamente después de ejecutar DROP_TASK, puede ver que la tarea se eliminó.
Hasta ahora, hemos visto un caso simple de procesamiento paralelo del método de partición ROWID.
A continuación, observamos qué tan uniformes son las unidades de trabajo divididas por ROWID, si no hay omisiones y cuál es la correlación entre el número de fragmentos y el número de trabajos (paralelismo).
El entorno que probé era Oracle 11g R2 (11.2) y no había estado NO_CHUNKS en ese momento.
Después de hacer una búsqueda en Google, encontré lo siguiente:
———————————–
NO_CHUNKS: la tabla asociada con la tarea no tiene fragmentos creados
———————————–
Los bloques se dividen por ROWID, pero cuando todos los bloques dentro del fragmento no tienen datos, parece estar en el estado NO_CHUNKS.
La prueba es difícil porque no he usado Oracle recientemente.
Tenga en cuenta.
Lo ejecuté usando DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID, pero cuando miro el estado de la tarea, veo el estado NO_CHUNKS ¿Sabes el motivo?
El entorno que probé era Oracle 11g R2 (11.2) y no había estado NO_CHUNKS en ese momento.
Después de hacer una búsqueda en Google, encontré lo siguiente:
———————————–
NO_CHUNKS: la tabla asociada con la tarea no tiene fragmentos creados
———————————–
* Fuente: documento Oracle 19c
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_PARALLEL_EXECUTE.html#GUID-5581516D-AB22-4748-8476-C5BB38BE7E2F
Los bloques se dividen por ROWID, pero cuando todos los bloques dentro del fragmento no tienen datos, parece estar en el estado NO_CHUNKS.
La prueba es difícil porque no he usado Oracle recientemente.
Tenga en cuenta.