본문 바로가기

Database/PLSQL

097 - [Oracle PL/SQL] Compiler - plsql_code_type

 

 

 

INTERPRETED

PL/SQL library units will be compiled to PL/SQL bytecode format.

Such modules are executed by the PL/SQL interpreter engine.

NATIVE

PL/SQL library units (with the possible exception of top-level anonymous PL/SQL blocks)

will be compiled to native (machine) code.

Such modules will be executed natively without incurring any interpreter overhead.

 

When the value of this parameter is changed, it has no effect on PL/SQL library units that have already been compiled. The value of this parameter is stored persistently with each library unit.

If a PL/SQL library unit is compiled native, all subsequent automatic recompilations of that library unit will use native compilation.

 

 

 

NATIVE 타입이 INTERPRETED 타입보다 빠른 실행시간을 보인다.

 

 

  • 준비 - sys 로그인해서 select 권한을 hr 사용자에게 할당
-- login as sysdba
alter session set container=orclpdb
/
Grant select on v_$parameter to hr;

 

 

 

-- login as hr
col name for a20
col value for a20


-- 현재 파라미터 값 확인
SELECT name, value
FROM v$parameter
WHERE name ='plsql_code_type';
----------------------------------------
NAME                 VALUE               
-------------------- --------------------
plsql_code_type      INTERPRETED

 

 

 

  • 프로시져 생성
drop procedure p1;
/
create or replace procedure p1 
is
begin
    dbms_output.put_line('P1');
end;

 

 

 

  • 상태 확인 - user_plsql_object_settings
select name, type, PLSQL_OPTIMIZE_LEVEL as OPT_level, PLSQL_CODE_TYPE,PLSQL_WARNINGS
from user_plsql_object_settings
where name ='P1';
----------------------------------------------------------------------
NAME       TYPE        OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS      
---------- ---------- ---------- --------------- --------------------
P1         PROCEDURE           2 INTERPRETED     DISABLE:ALL

 

 

 

  • 파리미터의 코드 타입 변경 및 확인하는 방법
--you can do alter system, but this for DBA
--코드 상태를 native 로 변경
ALTER SESSION SET plsql_code_type=native; 


-- P1 프로시져 정보는 아직도 INTERPRETED 인데, 
-- 파라미터를 변경했지만 이전에 컴파일한 프로시져의 정보는 유지되기 때문이다
select name, type, PLSQL_OPTIMIZE_LEVEL as OPT_level, PLSQL_CODE_TYPE,PLSQL_WARNINGS
from user_plsql_object_settings
where name ='P1';
----------------------------------------------------------------------
NAME       TYPE        OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS      
---------- ---------- ---------- --------------- --------------------
P1         PROCEDURE           2 INTERPRETED     DISABLE:ALL   


--이런 경우는 컴파일을 다시하면 코드타입이 변경된 것을 확인가능함.
create or replace procedure p1 
is
begin
    dbms_output.put_line('P1');
end;


-- 코드 타입이 네이티브로 변경된 것을 확인함.
select name, type, PLSQL_OPTIMIZE_LEVEL as OPT_level, PLSQL_CODE_TYPE,PLSQL_WARNINGS
from user_plsql_object_settings
where name ='P1'
---------------------------------------------------------------
NAME       TYPE        OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS      
---------- ---------- ---------- --------------- --------------------
P1         PROCEDURE           2 NATIVE          DISABLE:ALL

 

 

 

  • 파리미터의 코드 타입 변경 및 확인하는 방법
--테스트를 위해서 코드타입을 원래상태로 다시 전환한다
ALTER SESSION SET plsql_code_type=INTERPRETED;
/*
NAME       TYPE        OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS      
---------- ---------- ---------- --------------- --------------------
P1         PROCEDURE           2 INTERPRETED     DISABLE:ALL 
*/


-- 프로시져를 테스트용으로 변경
create or replace procedure p1
is
	n number:=0;
begin
	for i in 1..500000000
	loop
	    n:=n+1;
    end loop;
end;



--"plsql_code_type=INTERPRETED" 조건에서 프로시져 실행시간은 9.7초
exec p1


--"plsql_code_type=native" 조건에서 프로시져 상태 변경
--파라미터에서 변경하면 컴파일을 다시해야 하지만 프로시져 객체 정보를 직접 변경하면 컴파일하지 않아도 됨
alter procedure p1 compile  plsql_code_type=native;
/*
NAME       TYPE        OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS      
---------- ---------- ---------- --------------- --------------------
P1         PROCEDURE           2 NATIVE          DISABLE:ALL 
*/


--컴파일을 하지 않았지만 코드타입이 NATIVE 로 변경되어 있고, 실행시간도 단축된것을 확인 가능함
--"plsql_code_type=native" 조건에서 프로시져 실행시간은 7.5초
exec p1


--PLSQL_CODE_TYPE 상태를 INTERPRETED에서 NATIVE로 변경하니 9.7초에서 7.5초로 실행시간이 단축됨