2.5. Comprobación detallada de la partición de la unidad de trabajo (DBMS_PARALLEL_EXECUTE)

Esto está relacionado con la verificación de los detalles de la división de la unidad de trabajo. Examine el grado en que el resultado de dividir las unidades de trabajo (fragmentos) por ROWID se divide uniformemente, si la suma de las unidades de trabajo es igual al total y si no hay omisiones, y la correlación entre el número de unidades de trabajo y el número de puestos de trabajo.

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

2. Caso de procesamiento paralelo del método de división ROWID

2.5. Comprobación de detalles de división de unidad de trabajo

Echemos un vistazo a lo siguiente para ver si la unidad de trabajo está bien dividida.

  • Uniformidad de las unidades de trabajo divididas por ROWID
  • Verifique que no falten unidades de trabajo divididas por ROWID
  • Correlación entre el número de unidades de trabajo (fragmentos) y el PARALLEL_LEVEL (el número de trabajos a ejecutar)

2.5.1. Uniformidad de las unidades de trabajo divididas por ROWID

La siguiente división significa dividir la tabla Z_DPE_TEST_TAB en 10 000 unidades de trabajo según el recuento de 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;
/

Veamos si realmente se divide por 10,000.

-- 작업단위 개수 확인 --> 115
SELECT COUNT(*)
  FROM USER_PARALLEL_EXECUTE_CHUNKS
WHERE TASK_NAME = 'DPE_TEST(BY ROWID)';

Dado que el número total de filas es 1 000 000, parece que debería dividirse en 100 fragmentos si se divide en 10 000 filas, pero en realidad está dividido en 115 fragmentos.

Si calcula el recuento de filas para cada fragmento,

SELECT  B.CHUNK_ID, COUNT(A.ID), MIN(A.ID) MIN_ID, MAX(A.ID) MAX_ID
  FROM  Z_DPE_TEST_TAB A,
        (
        SELECT  CHUNK_ID, START_ROWID, END_ROWID
          FROM  USER_PARALLEL_EXECUTE_CHUNKS
         WHERE  TASK_NAME = 'DPE_TEST(BY ROWID)'
        ) B
 WHERE  A.ROWID BETWEEN B.START_ROWID AND B.END_ROWID
 GROUP  BY B.CHUNK_ID
 ORDER  BY B.CHUNK_ID;

Puede ver que está dividido en varios conteos, como 1334, 2064 y 1886, no 10,000.

chunk별 row count
recuento de filas por fragmento

El número de filas contenidas en el fragmento es 14 en la sección de 1000 a 2000 filas, 2 en la sección de 2000 filas, 33 en la sección de 6000 filas, 64 en la sección de 11 000 filas y 2 en la sección de 12 000 filas. (Es posible que no dé el mismo resultado cada vez).

Row수 구간별 chunk수
Número de filas Número de fragmentos por sección

Como tal, no se divide en un número completamente igual de filas. Esto parece deberse a que el método de partición ROWID se basa en DBA_EXTENTS, y la cantidad de bloques incluidos en cada EXTENSIÓN y el recuento de FILAS de cada bloque pueden ser diferentes. Como referencia, si hay BLOQUES no utilizados en la tabla por DELETE, etc., se puede crear una sección ROWID donde realmente no existen datos como un fragmento. También se espera que esto ocurra cuando los datos se eliminan después de haber sido asignados a DBA_EXTENT, o cuando hay EXTENT que se han asignado pero no contienen datos reales.

2.5.2. Verifique que no falten unidades de trabajo divididas por ROWID

¿Podrían faltar datos cuando se expanden las secciones START_ROWID y END_ROWID de cada fragmento?

Primero, verifiquemos el conteo de filas.

-- Chunk의 RowID range로 추출한 Row Count
SELECT  COUNT(A.ID) ROW_COUNT
  FROM  Z_DPE_TEST_TAB A,
        (
        SELECT  CHUNK_ID, START_ROWID, END_ROWID
          FROM  USER_PARALLEL_EXECUTE_CHUNKS
         WHERE  TASK_NAME = 'DPE_TEST(BY ROWID)'
        ) B
 WHERE  A.ROWID BETWEEN B.START_ROWID AND B.END_ROWID;
row count 일치 확인
Compruebe las coincidencias de recuento de filas

Coincidencia del recuento total de filas de 1 000 000, una vez que se confirmó que no faltaba el recuento y, luego, en función de los datos extraídos en el rango de START_ROWID a END_ROWID de Chunk, cuando los datos originales se LEFT OUTER JOINed, falta (falta) ) a ver si los datos existen.

-- Chunk의 RowID로 추출한 데이터의 누락없음 확인
SELECT  *
  FROM  Z_DPE_TEST_TAB A LEFT OUTER JOIN
        (
        SELECT  A.ID  -- Chunk의 RowID range로 추출한 데이터
          FROM  Z_DPE_TEST_TAB A,
                (
                SELECT  CHUNK_ID, START_ROWID, END_ROWID
                  FROM  USER_PARALLEL_EXECUTE_CHUNKS
                 WHERE  TASK_NAME = 'DPE_TEST(BY ROWID)'
                ) B
         WHERE  A.ROWID BETWEEN B.START_ROWID AND B.END_ROWID
        ) B ON (A.ID = B.ID)
 WHERE  B.ID IS NULL;
데이터 누락 없음 확인
Asegúrate de que no falten datos

De los resultados anteriores, se puede ver que no faltan datos.

2.5.3. Correlación entre el número de unidades de trabajo (fragmentos) y el PARALLEL_LEVEL (el número de trabajos a ejecutar)

<2.3. En Ejecución de tareas>, había el siguiente contenido.

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.

* Referencia: 2. Caso de procesamiento paralelo del método de división ROWID_2.3. ejecución de trabajo

Considere los siguientes casos con respecto a la cantidad de fragmentos y la cantidad de trabajos.

▼ Cuando el número de fragmentos y el número de trabajos es el mismo (Chunk = Job)

Cuando un trabajo completa la ejecución del fragmento asignado, finaliza porque no hay más trabajos para ejecutar.

Chunk수와 Job수가 동일한 경우
Cuando el número de fragmentos y el número de trabajos son los mismos

▼ Cuando la cantidad de trabajos es menor que la cantidad de fragmentos (Chunk > Job)

Cuando se completa el trabajo del fragmento al que se asigna el trabajo, el fragmento que aún no se ha ejecutado se asigna y ejecuta de forma continua. A continuación se muestra un ejemplo cuando hay 3 trabajos.

Chunk수보다 Job수가 적은 경우 (Chunk > Job)
Cuando el número de trabajos es menor que el número de fragmentos (Chunk > Job)

Además, si la cantidad de trabajos es mayor que la cantidad de fragmentos (Chunk < Job), también es posible, pero es mejor no aplicarlo porque los fragmentos no se asignan y se pueden usar recursos innecesarios manteniendo el estado de ejecución. .

* Referencia: DBMS_PARALLEL_EXECUTE Chunk por ROWID Ejemplo


Hasta ahora, hemos analizado el método de partición ROWID. A continuación, mire el método de partición de la columna NÚMERO.

Deja una respuesta

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

es_ESEspañol