PL/SQL Native Compilation

Herkese Selam,

Bu yazıda sizlere PL/SQL ‘de sorgu performansımızı artıracak Oracle’ın native compilation özelliğinden bahsedeceğim umarım farkındalık açısından faydalı bir yazı olur.

Oracle bir PL/SQL konudunu işlerken default olarak interpreted modda çalıştırır. Oracle’ın interpreted modda çalışmasının anlamı şudur. Yazılan PL/SQL kodu (procedure, package, vs) öncelikle bytecode a (diğer bir adı ile mcode, machine code) çevirilir ve saklanır. Kod daha sonra çalıştırıldığı anda (run time) bu bytecode, sistem çağrılarına çevirilir ve kod execute edilir. PL/SQL kodunu her çalıştırdığımızda bu dönüşümün yapılması yer yer performans kayıplarına sebebiyet vermekte. Bu performans kayıplarını iyileştirme tekniklerinden biride PL/SQL native compilation yöntemi.

PL/SQL native compilation Oracle 9i den bu yana ürünün içinde gelen özelliklerden biri. PL/SQL native compilation mode’un çalışma mantığına bakmak gerekirse; Oracle burada interpreted modda yaptığı gibi runtime da bytecode u sistem çağrılarına interpret etmeyecek, PL/SQL kodunu derleme zamanında  C koduna çevirecek ve arka tarafta bir OS process ile ilişkilendirecek bundan dolayı sistem kod her çalıştırıldığında bu işlemi tekrar tekrar yapmayarak performans artışı sağlayacak. Bu yüzden bu modda compile edilmiş PL/SQL kodları interpreted moda göre daha hızlı çalışacak.

Oracle’ın native compilation özelliğini kullanılabilmesi için 11g öncesi sürümler için Oracle kurulu olan node larda C compiler’ın var olduğundan emin olunmalıdır. Ancak Oracle 11g bu iş için  C compiler a ihtiyaç duymamaktadır. Istenen compiler modunu PLSQL_CODE_TYPE parametresini session yada sistem özelinde set ederek istenen moda rahatça geçilebilmektedir.

ALTER SYSTEM SET PLSQL_CODE_TYPE = NATIVE;
ALTER SYSTEM SET PLSQL_CODE_TYPE =INTERPRETED;

Bu parametrenin current durumuna ise aşağıdaki sorgu ile bakılabilir.

SELECT * FROM v$parameter WHERE name = ‘plsql_code_type’

Şimdi Örnekle 2 durum arasındaki çalışma zamanı farklarına bakalım;

CREATE OR REPLACE PROCEDURE SYS.fcs(p_number IN OUT NUMBER)
IS
BEGIN
FOR i IN 1 .. p_number
LOOP
p_number := p_number / i+i;
END LOOP;
END;
/

ALTER SYSTEM SET PLSQL_CODE_TYPE = NATIVE;
ALTER PROCEDURE SYS.fcs COMPILE;
SET TIMING ON

DECLARE
result NUMBER;
BEGIN
result := 500000000;
sys.fcs (result);
DBMS_OUTPUT.put_line (result);
END;
System altered.
Procedure altered.
PL/SQL procedure successfully completed.
Elapsed: 00:01:09.72

ALTER SYSTEM SET PLSQL_CODE_TYPE = INTERPRETED;
ALTER PROCEDURE sys.factorial COMPILE;
SET TIMING ON

DECLARE
result NUMBER;
BEGIN
result := 500000000;
sys.fcs (result);
DBMS_OUTPUT.put_line (result);
END;
System altered.
Procedure altered.
PL/SQL procedure successfully completed.
Elapsed: 00:01:26.97

Örnekten de görüldüğü üzere native olarak compile ettiğimiz fonksyon diğerine göre daha hızlı çalıştı. Native compilation ın daha hızlı çalıştığı fonksyon ve procedure ler genellikle matematiksel hesap bağımlı işlerdir. Her tip işte bu tarz bir performans kazancı beklemek çok doğru olmayacaktır.

Umarım farkındalık anlamında faydalı bir yazı olmuştur.

Kaynaklar:

http://www.oracle.com/technetwork/articles/sql/11g-plsql-091775.html

http://www.oracle-base.com/articles/9i/plsql-native-compilation-9i.php

http://twelvec.com/tag/alter-session-set-plsql_code_type-native/

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s