Burada bahsedeceğimiz bu özellik 11g ile beraber gelen zaman zaman dayanlış yapmamızın önüne geçen güzel bir özellik aslında ama yeteri kadar bilinmediği kaanatindeyim.
Önce kısaca ne olduğundan bahsedelim. Kimi zaman aktif olarak çalışan bazı sql’ lerin performanslarında ciddi yavaşlamalar görürüz. Bunu ya biz farkederiz yada kullanıcılardan gelen şikeyetler doğrultusunda farkederiz. Bu tarz durularda öncelikle sorgunun execution planını incelemekle işe başlarız sonrasında select edilmeye çalışılan data miktarı, sorgu içerisindeki where conditionları olmak üzere bazı noktaları gözden geçiririz. İşte bunlardan biride ki çoğu zaman aldığımız ilk aksiyon da budur diyebiliriz, istatistiklerin güncel olup olmadığını kontrol etmek veya hemen bir istatistik alıp sorgunun performansına ondan sonra bakmak oluyor. İşte tam bu noktada özelliklede üzerinde çalıştığınız tablolar çok büyük ise istatistikleri güncelenin etkilerini önce siz gördükden sonra ve sorgunun performansına olumlu etkileri test ettikten bu istatistikleri diğer kullanıcılarında kullanımına sunmak sizi oluşabilecek daha kötü bir senaryodan koruyacaktır.
Şimdi bir örnek ile bu durumu açıklamaya çalışalım ;
Öncelikle alacağımız istatistiklerin tüm kullanıcıların görmesini engelliyoruz. Bundan sonra bu sessiondan alacağımız tüm istatistikler den sadece bu sessiondaki sorgularımız etkilenecektir.
SQL> execute dbms_stats.set_table_prefs (‘KAMIL’,’SALES3′,’PUBLISH’,’FALSE’)
PL/SQL procedure successfully completed.
Bundan sonra toplanacak olan istatistiklerin hiçbiri diğer kullanıcıların kullanımına açılmayacak olup, siz yayınlamaya karar verilene kadar bekletilecektir. Yayınlamaya karar verdiğinizde de tekrar ayrıca bir istatistik toplamanıza gerek kalmadan yayınlayabilirsiniz.
Şimdi istatistiğimizi toplayalım ;
SQL> BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS (
OwnName => ‘KAMIL’
,TabName => ‘SALES2’
,Estimate_Percent => NULL
,Method_Opt => ‘FOR COLUMNS SIZE AUTO’
,Degree => 4
,Cascade => FALSE
);
END;
PL/SQL procedure successfully completed.
Topladığımız bu PENDING statatusundeki bu istatistikleri testlerimizde kullanabilmek için aşağıdaki parametreyi set ediyoruz;
SQL>alter session set optimizer_use_pending_statistics=TRUE ;
Session altered.
Son durumda eğer almış olduğumuz istatistiklerimizi yayınlamaya karar verirsek aşağıdaki komutu kullanmamız yeterli olacaktır ;
SQL>exec dbms_stats.publish_pending_stats(‘KAMIL’,’SALES2′);
PL/SQL procedure successfully completed.
Burada şu sorulabilir, almış olduğumuz bu son istatistiği kullanmamaya karar verirsek ne yapabiliriz. O zamanda PENDING durumdaki istatistikleri aşağıdaki plsql bloğubu kullanarak silebiliriz ;
SQL> begin
DBMS_STATS.DELETE_PENDING_STATS(‘KAMIL’, ‘SALES2’);
end;
PL/SQL procedure successfully completed.