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:
- Parallel Statement (pSqlParallelStatement) - Invantive Product Documentation
- dbms_parallel - Invantive Product Documentation
- dbms_lock - Invantive Product Documentation
- Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks
Disponibilidad
La nueva funcionalidad está disponible desde la versión 27.0.