sql >> Base de Datos >  >> RDS >> Oracle

Aumente el rendimiento con la recopilación masiva en Oracle

Use Bulk Collect para recuperar varias filas de datos en una sola operación de recuperación. Múltiples filas de datos en una sola búsqueda reducen la cantidad de viajes de ida y vuelta de la red y mejoran el rendimiento.
El siguiente ejemplo describe el trabajo enumerado en la tabla JOB_HISTORY que era el trabajo que tenía el empleado, pero también el trabajo al que asistió después de la trabajo enumerado en la tabla JOB_HISTORY.
CREAR O REEMPLAZAR PROCEDIMIENTO Promotion_Rev

IS
antiguo_trabajo hr.job_history.job_id%TYPE;
nuevo_trabajo hr.job_history.job_id%TYPE;
nincr NUMBER;

CURSOR cselectjob
ES
SELECCIONAR id_empleado,
fecha_inicio,
fecha_finalización,
id_trabajo
FROM hr.historial_trabajo
ORDENAR POR id_empleado, fecha_inicio;

TIPO jh_rec ES REGISTRO (
employee_id hr.job_history.employee_id%TYPE,
start_date hr.job_history.start_date%TYPE,
end_date hr.job_history.end_date%TYPE,
job_id hr .job_history.job_id%TYPE
);

TIPO jh_table ES TABLA DE jh_rec
ÍNDICE POR PLS_INTEGER;

jh_table_array jh_table;
COMENZAR
ABRIR cselectjob;

FETCH cselectjob
RECOGIDA A GRANEL EN jh_table_array;

CERRAR cseleccionartrabajo;

FOR contador IN jh_table_array.FIRST .. jh_table_array.LAST
LOOP
IF contador =jh_table_array.LAST
THEN
nincr :=0;
ELSE
nincr :=1;
FIN SI;

old_job :=jh_table_array (contador).job_id;

IF jh_table_array (contador).id_empleado =
jh_table_array (contador + nincr).id_empleado
THEN
nuevo_trabajo :=jh_table_array (contador + nincr).job_id;
ELSE
SELECCIONE job_id
EN new_job
DESDE hr.employees
DONDE hr.employees.employee_id =
jh_table_array (contador).employee_id;
END IF;

DBMS_OUTPUT.put_line( 'Empleado '
|| jh_table_array (contador).employee_id
|| ' tenía trabajo '
|| antiguo_trabajo
|| ' for '
| | (jh_table_array (contador).fecha_final
- jh_table_array (contador).fecha_inicial)
|| ' días y movido al trabajo '
|| nuevo_trabajo
|| '.');
FIN DEL BUCLE;
FIN;
/

Ejecute el siguiente procedimiento:

configure serveroutput on;
BEGIN
Promotion_rev;
END;
/
La salida debería ser algo como esto:

El empleado 101 tuvo el trabajo AC_ACCOUNT durante 1497 días y pasó al trabajo AC_MGR.
El empleado 101 tuvo el trabajo AC_MGR durante 1234 días y pasó al trabajo AD_VP.
El empleado 102 tuvo el trabajo IT_PROG durante 2018 días y pasó al trabajo AD_VP.
El empleado 114 tuvo el trabajo ST_CLERK durante 647 días y se cambió al trabajo PU_MAN.
El empleado 122 tuvo el trabajo ST_CLERK durante 364 días y se cambió al trabajo ST_MAN.
El empleado 176 tuvo el trabajo SA_REP durante 282 días y se mudó al trabajo SA_MAN.
El empleado 176 tuvo el trabajo SA_MAN durante 364 días y se cambió al trabajo SA_REP.
El empleado 200 tuvo el trabajo AD_ASST durante 2100 días y se mudó al trabajo AC_ACCOUNT.
El empleado 200 tuvo el trabajo AC_ACCOUNT durante 1644 días y se trasladó al trabajo AD_ASST.
El empleado 201 tuvo el trabajo MK_REP durante 1401 días y se trasladó al trabajo MK_REP.
El procedimiento PL/SQL se completó con éxito.