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;10SQL> exec :sal := 10000;PL/SQL procedure successfully completed.SQL> select count(*) from employees where salary = :sal;3
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.
YanıtlaSilcanvas couch cover
buy sofa cover