Menu

19 Ocak 2013 Cumartesi

Oracle Bind variables

Bind Variables 

Yukarida uc farkli SQL gormekteyiz. Daha onceki bolumlerdede gormustuk, oracle SQL`leri library cache`de tutmaktadir. Bu uc SQL`de ayni islemi farkli degerlerle yapsa bile, sonuc olarak ayni SQL`dir. Ama acikca goruluyor ki, her uc SQL`de ayri ayri library cahce`de tutulmakta ve her yeni SQL`e yeni sqlmis gibi davraniyor ve SQL statement parse-execute-fecth adimlarini her seferinde yeniden yapmakta ve performans kaybina neden olmaktadir. Hatirlayam, parse islemi en uzun ve en cok zaman alan bolumdu, bizim parse`dan mutlaka kacinmamiz gerekmektedir. 

Seklimiz uzerinde yeniden devam edecek olursak, ilk SQL`imiz calisti ve library cache atildi, ikinci SQL calistiginda oracle once library cahce bakiyor ve SQL`i bulamiyor ve yeni bir ayiriyor. Ve her SQL icin yeni bir execution plan olusturuyor.
Bu sekilde bir kullanimda, cursor sharing avantajli degildir. 

Oracle veritabanı yazılan SQL ya da PL/SQL kodlarının bir kere yazılıp devamlı kullanılmasına imkan vermektedir. Simdi oracle olan parse islemleri gorelim. Oracle`da iki turlu parse islemi vardir. Ve eger ayni sql bu iki asamadan yapiyorsa sorgularimizi duzenlemeiz gerekmektedir. 

Peki bu parse islemleri hangileridir.
Hard parse
Soft parse

Hard parse : Oracle veritabaninda SQL ya da PL/SQL kod daha önce kullanılmamış ve shared poolun library cache`inde yoksa sırasıyla parsing ve optimization aşamalarını geçirdikten sonra row-source-generator ve son olarak gerçek anlamda veriyi getiren execution aşamalarından geçmesidir.

Soft parse : Shared Pool (library cache) da var ise elimizde optimizer plan(execution plan) var demektir ve bu da dogrudan “execution” aşamasına geçilebilir anlamına gelmesine isleminde oracle soft parse yapiyordur.

Not : Hard parse ve soft parse ile ilgili cok guzel bir sozu vardir. Soft parse kotudur ama hard parse cok cok daha kotudur. Buradan sunu cikarabiliriz bir kere parse  yapılınca aynı kodun devamlı olarak bir daha parse görmeden çalışmasını sağlayabilmemizdir.

 Peki bunun nasil yapabiliriz.? Iste burada sorunun cevabi bind variable kullanımıdir.
Sorgularinizda bind variable kullanidigimizda extra parse islemlerinden kurtulmus oluruz ve execution time çok daha kısa sürer(daha once execution plan(optimizer plan) olusturulmustu) ve bu durumda çok kullanıcılı ve yoğun işlemlerin yapıldığı veritabanlarında cok buyuk performans saglamis oluruz. 

Performansın yanında parse esnasında library cache alanı da meşgul edileceği için sistem bu anlamda da zorlanacaktır.Çünkü aynı anda pek çok kullanıcı bu alanı kullanmak zorunda kalacaktır.
Simdi yukaridaki seklimizi asagidaki gibi degistirelim.


Seklimizde acik bir sekilde goruluyor ki, library cache`de bi tane sql`imiz var. 
Simdi bir SQL*Plus kullanarak bind variable ornegine bakalim.
SQL> variable sal varchar2(10);
SQL> exec :sal := 5000;
PL/SQL procedure successfully completed.
SQL> select count(*) from employees where sal = :sal;
     10
SQL> exec :sal := 10000;
PL/SQL procedure successfully completed.
SQL> select count(*) from employees where salary = :sal;
      3

Hiç yorum yok:

Yorum Gönder