2. Caso de procesamiento paralelo de partición ROWID (DBMS_PARALLEL_EXECUTE)

Echemos un vistazo al caso del procesamiento paralelo del método de partición ROWID usando Oracle DBMS_PARALLEL_EXECUTE.

Esta es una continuación del artículo anterior.

1. Descripción general del procesamiento paralelo de trabajos DML (DBMS_PARALLEL_EXECUTE)

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;
1단계: 작업 생성 확인
Paso 1: Confirmar la creación de la tarea

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

* Referencia: http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_parallel_ex.htm#ARPLS67333

2.2. unidad de trabajo dividida

CREATE_CHUNKS_BY_ROWID( ,

,
, , ) para dividir la unidad de trabajo.

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)';
2단계: 작업 분할 상태 확인
Paso 2: Comprobar el estado de división de tareas

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

* Referencia: http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_parallel_ex.htm#ARPLS67333

2.3. ejecución de trabajo

EJECUTAR_TAREA( , , , ) para ejecutar la tarea.

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;
3단계: 동시 실행현황 확인(작업 실행전)
Paso 3: verificar el estado de ejecución simultánea (antes de la ejecución de la tarea)

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;
3단계: 동시 실행현황 확인(작업 실행중)
Paso 3: verificar el estado de ejecución simultánea (ejecución de tareas)

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)';
3단계: 작업의 Chunk별 진행상황/완료 확인
Paso 3: verifique el progreso/finalización de cada parte de la tarea

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;
3단계: Chunk의 상태별 진행상황 확인
Paso 3: Comprobar el progreso de los fragmentos por estado

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;
작업 완료 확인
Confirmar la finalización de la tarea

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;
/
4 단계: 작업 완료 확인 및 작업 삭제
Paso 4: verifique la finalización del trabajo y elimine el trabajo

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).

2 Respuestas

  1. foto de avatar newyemac dice:

    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?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *