Mayor transferencia de datos gracias a las construcciones "paralelas" en PSQL

La ejecución paralela en PSQL reduce el tiempo de procesamiento de trabajos por lotes en una máquina, con un manejo elegante de errores.

Invantive PSQL ahora ofrece procesamiento paralelo: la declaración compuesta parallel ... branch ... end parallel para bloques heterogéneos en paralelo, y una cláusula parallel en ambos bucles for para trabajos homogéneos por fila.

La Declaración parallel

La declaración parallel permite la ejecución simultánea de varios bloques PSQL, cada uno precedido por branch y una etiqueta opcional. Un número (opcional) después de parallel indica el número máximo de ejecuciones paralelas, como en:

begin
  parallel 2
  branch <<primero>>
    begin
      dbms_output.put_line('primero listo');
    end
  branch <<segundo>>
    begin
      dbms_output.put_line('segundo listo');
    end
  end parallel;
end;

La salida es, donde el orden de las dos líneas sigue el orden de finalización y, por lo tanto, puede variar:

primero listo
segundo listo

Sin save exceptions, un bloque fallido detiene el inicio de ramas que aún no han comenzado; las ramas en ejecución completan su trabajo y luego se lanza nuevamente la excepción original, con el nombre de la rama fallida incluido. Por lo tanto, el manejo de errores existente sigue funcionando.

Con save exceptions, se ejecutan todos los bloques; si al menos uno falla, sigue una excepción acumulada parallel_error. Las excepciones individuales se pueden localizar a través de la función de tabla dbms_parallel.saved_exceptions().

Bucles For Paralelos

También es posible procesar resultados de un bucle for en paralelo como con:

...
    for r in
    ( select ...
    )
    parallel 8
    save exceptions
    loop
    ...
    end loop;
...

dbms_lock

La sincronización entre ramas paralelas es posible con nuevas funciones de dbms_lock (ver Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks).

dbms_output

Las líneas de dbms_output de una acción paralela se tratan como una salida única: se almacenan en el búfer por rama y aparecen por completo una vez que la rama está lista.

Ejemplo: Procesamiento Paralelo de Facturas con Capacidad de Reinicio

El siguiente ejemplo muestra el patrón para el procesamiento financiero por pieza: paralelo sobre las filas, intentar todas las filas con save exceptions, enumerar los fallos al finalizar, y capacidad de reinicio mediante un filtro de estado para que una ejecución repetida solo recoja el remanente:

declare
  l_cnt number;
begin
  create or replace table facturen@InMemoryStorage
  as
  select 1 factuur_id, 'OPEN' status from dual@DataDictionary
  union all
  select 2 factuur_id, 'OPEN' status from dual@DataDictionary
  union all
  select 3 factuur_id, 'OPEN' status from dual@DataDictionary
  ;
  begin
    for r in
    ( select fct.factuur_id
      from   facturen@InMemoryStorage fct
      where  fct.status = 'OPEN'
    )
    parallel 8
    save exceptions
    loop
      --
      -- Procesamiento por factura; la factura 2 falla intencionalmente aquí.
      --
      declare
        l_x number;
      begin
        l_x := 1 / (r.factuur_id - 2);
        update facturen@InMemoryStorage
        set    status = 'VERWERKT'
        where  factuur_id = r.factuur_id
        ;
      end;
    end loop;
  exception
    when parallel_error
    then
      l_cnt := 0;
      for f in
      ( select instance
        from   table(dbms_parallel.saved_exceptions())
      )
      loop
        l_cnt := l_cnt + 1;
      end loop;
      dbms_output.put_line(l_cnt || ' factura no procesada; una ejecución posterior recogerá el remanente.');
  end;
  drop table facturen@InMemoryStorage;
end;

La salida es:

1 factura no procesada; una ejecución posterior recogerá el remanente.

Limitación de Tasa

El paralelismo acelera principalmente el trabajo con tiempo de espera, como llamadas a servicios en la nube y secciones heterogéneas en paralelo. El rendimiento en una sola plataforma sigue estando limitado por las restricciones de esa plataforma; esas limitaciones se mantienen bajo PSQL paralelo.

Consulte También

Consulte también los siguientes temas:

Disponibilidad

La nueva funcionalidad está disponible desde la versión 27.0.