Natív fordítás

Natív fordítás során a p-kódból (lásd 9. fejezet) a fordító egy olyan C nyelvű forrásszöveget hoz létre, amely közvetlenül tartalmazza az utasításoknak megfelelő API hívásokat. Ezt a Cforrást aztán a rendszerben rendelkezésre álló C fordítóval fordítja be egy osztott könyvtárba(.so vagy .dll állományba). Az osztott könyvtárat az adatbázisban is tárolja, hogy azadatbázis mentésében benne legyen. Amikor az így lefordított programegységet végre kellhajtani, már nincs szükség az interpreterre, elég az osztott könyvtárat használni. Így megnyerjüka kód értelmezésének idejét és a C fordító által végzett optimalizálásokból is profitálunk,a fordítási idő azonban növekszik.

Ebből következik, hogy a natív fordítás elsősorban a nagy számításigényű kódoknál eredményezhetjelentősebb teljesítménynövekedést. Az SQL utasítások végrehajtását nem gyorsítja, a típus- és csomagspecifikációkat sem nagyon, mert azokban vagy nincs futtathatókód vagy csak nagyon kevés. A fordítás módja miatt garantált, hogy a natívra fordított kódfutási ideje nem lesz rosszabb, mint az interpretált kódé, és működésük is azonos lesz,mivel ugyanazok az alacsony szintű API hívások történnek meg mindkettő esetén. A PL/SQL fordító optimalizáló tevékenysége is ugyanaz mindkét esetben.

A natív fordítást a PLSQL_CODE_TYPE inicializációs paraméterrel szabályozzuk, értéke INTERPRETED vagy NATIVE lehet. Az INTERPRETED az alapértelmezett. A PL/SQL programegységeknél egyenként is dönthetünk a fordítás módjáról. Lehetőség van arra is, hogy akár az összes kódot natívra fordítsuk, beleértve a rendszerhez tartozó PL/SQL csomagokat is. Mindezt megtehetjük az adatbázis létrehozásakor vagy már létező adatbázisnál is.

Natív fordításhoz a DBA segítségével be kell még állítani a PLSQL_NATIVE_LIBRARY_DIR inicializációs paraméterben azt, hogy az állományrendszerben hol helyezkedjenek el majd a kódokhoz tartozó osztott könyvtárak. Több ezer lefordított állomány esetén javasolt azok alkönyvtárakba szervezése és a PLSQL_NATIVE_LIBRARY_SUBDIR_COUNT paraméter használata. A könyvtárakat az operációs rendszerben kézzel kell létrehozni, megfelelő védelmet biztosító beállításokkal. Ezekről a beállításokról és az adatbázis összes PL/SQL kódjának natívra fordításáról bővebben lásd [19] 11. fejezet és [17].

A C kódból az osztott könyvtár létrehozásához meghívandó parancsokat tartalmazó sablon a $ORACLE_HOME/plsql/spnc_commands állomány. Ebben kell ellenőrizni és szükség esetén módosítani a parancsok elérési útjait.

Fordítsuk le a 16.2. alfejezet 1. példájában megismert PROC_SZAMITAS eljárást és hasonlítsuk össze a futási időket.

Példa

CREATE OR REPLACE PROCEDURE proc_szamitas(

p_Iter PLS_INTEGER

) IS

a PLS_INTEGER;

b PLS_INTEGER;

c PLS_INTEGER;

BEGIN

FOR i IN 1..p_Iter

LOOP

a := i+1;

b := i-2;

c := b-a+1;

d := b-a-1; -- ismétlődő kifejezés előfordulása

END LOOP;

END proc_szamitas;

/

Az eljárást négy különböző módon újrafordítottuk majd futtattuk:

ALTER PROCEDURE proc_szamitas COMPILE

PLSQL_DEBUG=FALSE

PLSQL_OPTIMIZE_LEVEL={2|0}

PLSQL_CODE_TYPE={INTERPRETED|NATIVE}

;

SET TIMING ON

EXEC proc_szamitas(10000000);

SET TIMING OFF;

A futási idők a következőképpen alakultak:

2I - PLSQL_OPTIMIZE_LEVEL=2 PLSQL_CODE_TYPE=INTERPRETED

Eltelt: 00:00:03.05

2N – PLSQL_OPTIMIZE_LEVEL=2 PLSQL_CODE_TYPE=NATIVE

Eltelt: 00:00:01.82

0I - PLSQL_OPTIMIZE_LEVEL=0 PLSQL_CODE_TYPE=INTERPRETED

Eltelt: 00:00:05.78

0N - PLSQL_OPTIMIZE_LEVEL=0 PLSQL_CODE_TYPE=NATIVE

Eltelt: 00:00:03.33

A natívra fordított kód gyorsabb volt az interpretált párjánál, a legjobb eredményt az optimalizálás és a natív fordítás együtt adta.