sql >> Databáze >  >> RDS >> Oracle

Zvyšte výkon pomocí hromadného shromažďování v Oracle

Pomocí hromadného shromažďování načtěte více řádků dat v jediné operaci načtení . Více řádků dat v jednom načtení snižuje počet zpátečních cest po síti a zlepšuje výkon.
Následující příklad popisuje úlohu uvedená v tabulce JOB_HISTORY byla práce, kterou měl zaměstnanec, ale také úloha, do které zaměstnanec šel po úloha uvedená v tabulce JOB_HISTORY.
VYTVOŘENÍ NEBO NAHRAZENÍ POSTUP Promotion_Rev

JE
old_job hr.job_history.job_id%TYPE;
new_job hr.job_history.job_id%TYPE;
Nincr NUMBER;

CURSOR cselectjob
JE
VYBERTE ID_zamestnance,
datum_zahájení,
datum_ukončení,
ID_úlohy
OD hr.job_history
OBJEDNAT PODLE id_zaměstnance, datum_zahájení;

TYPE jh_rec JE ZÁZNAM (
id_zaměstnance hr.job_history.employee_id%TYPE,
datum zahájení hr.job_history.start_date%TYPE,
datum ukončení hr.job_history.end_date%TYPE,
job_id hr .job_history.job_id%TYPE
);

TYPE jh_table JE TABLE OF jh_rec
INDEX PODLE PLS_INTEGER;

jh_table_array jh_table;
BEGIN
OTEVŘÍT cselectjob;

NAČÍST cselectjob
HROMADNÝ SBĚR DO jh_table_array;

ZAVŘÍT cselectjob;

FOR counter IN jh_table_array.FIRST .. jh_table_array.LAST
LOOP
POKUD počítadlo =jh_table_array.LAST
THEN
nincr :=0;
ELSE
nincr :=1;
END IF;

old_job :=jh_table_array (counter).job_id;

POKUD jh_table_array (counter).employee_id =
jh_table_array (counter + nincr).employee_id
THEN
new_job :=jh_table_array (counter + nincr).job_id;
ELSE SELECT job_id
INTO new_job
FROM hr.employees
WHERE hr.employees.employee_id =
jh_table_array (counter).employee_id;
END IF;

DBMS_OUTPUT.put_line( 'Zaměstnanec '
|| jh_table_array (counter).employee_id
|| ' měl práci '
|| old_job
|| ' for '
| | (jh_table_array (counter).end_date
- jh_table_array (counter).start_date)
|| ' dnů a přesunuto do úlohy '
|| new_job
|| '.');
KONEC SMYČKY;
KONEC;
/

Proveďte následující postup:

set serveroutput on;
BEGIN
promotion_rev;
END;
/
Výstup by měl vypadat takto:

Zaměstnanec 101 měl práci AC_ACCOUNT po dobu 1497 dní a přešel do práce AC_MGR.
Zaměstnanec 101 měl práci AC_MGR po dobu 1234 dní a přešel do práce AD_VP.
Zaměstnanec 102 měl práci IT_PROG po dobu 2018 dní a přešel do práce AD_VP.
Zaměstnanec 114 měl práci ST_CLERK po dobu 647 dní a přešel do práce PU_MAN.
Zaměstnanec 122 měl práci ST_CLERK po dobu 364 dní a přešel do práce ST_MAN.
Zaměstnanec 176 měl práci SA_REP a 282 dní se přestěhoval do práce SA_MAN.
Zaměstnanec 176 měl práci SA_MAN po dobu 364 dní a přešel do práce SA_REP.
Zaměstnanec 200 měl práci AD_ASST po dobu 2100 dní a přešel do práce AC_ACCOUNT.
Zaměstnanec 200 měl práci AC_ACCOUNT po dobu 1644 dní a přešel do práce AD_ASST.
Zaměstnanec 201 měl práci MK_REP 1401 dní a přešel na práci MK_REP.
Procedura PL/SQL byla úspěšně dokončena.

  1. Jak zřetězit řetězce řetězcového pole v dotazu PostgreSQL „seskupit podle“?

  2. Získejte první pondělí v roce v SQLite

  3. Jak používáte proměnné v jednoduchém skriptu PostgreSQL?

  4. OFFSET vs. ROW_NUMBER()