Oracle SQL PLSQL Java üzerine Türkçe bilgi döküman

CBO için İstatistik toplamanın otomatikleştirilmesi

Posted by hakkioktay on March 15, 2007

Artık söylemeye bile gerek yok ama yine de tekrar edelim.Cost Based Optimizer(CBO) için kritik olan istatistik bilgilerinin toplanması önemli.

Indeksler için malum birkaç yöntem var :

Birincisi arzu edilen bir zamanda aşağıdaki şekilde yapılabilir :
     DBMS_STATS.GATHER_INDEX_STATS (‘SEMANIZIN_ADI’,’INDEKSINIZIN_ADI’);

Bir diğer yöntem daha indeks oluşturma aşamasında bunu isteyebiliriz :
     create index INDEKS_ADI ………. compute statistics; 

Zaman zaman indekslerinde “rebuild” ihtiyacı olabilir.Bunu sağlarken aynı zamanda indeks istatistiği de toplayabiliriz.
     alter index INDEKS_ADI rebuild compute statistics;

Ama 10g ile birlikte daha indeks oluşturulma aşamasında istatistik toplanmakta.Örnekle görelim :

drop table ttest;

create table ttest  as select object_id, object_name, object_type from all_objects;

create index  ttest_id_idx on ttest (object_id);

select index_name, last_analyzed, num_rows, sample_size from user_indexes where table_name = ‘TTEST’ ;

index_name     last_analyzed                 num_rows    sample_size
TTEST_ID_IDX   2/12/2007 3:59:01 PM     12332            12332

Ancak bu demek değilki tablo üzerinde işlem yapıldıkça istatistiklerde güncellensin.Böyle olmadıgını görelim :

insert into ttest select object_id, object_name, object_type from all_objects;

select index_name, last_analyzed, num_rows, sample_size from user_indexes where table_name = ‘TTEST’ ;

index_name     last_analyzed                  num_rows    sample_size
TTEST_ID_IDX    2/12/2007 3:59:01 PM     12332            12332

Görüldüğü gibi “last_analyzed” alanı insert işleminden sonra yani indeks üzerinde işlem olduktan sonra otomatik değişmiyor,yani istatistik anında güncellenmiyor.Bunu : analyze index ttest_id_idx compute statistics ile sağlarız.Bu komutu çalıştırıp tekrar sorgumuza bakalım :

analyze index ttest_id_idx compute statistics;

select index_name, last_analyzed, num_rows, sample_size from user_indexes where table_name = ‘TTEST’ ;

index_name     last_analyzed                 num_rows    sample_size
TTEST_ID_IDX    2/12/2007 3:59:53 PM     36998           36998

Pek bunun otomatiğe alamazmıyız? Tonguç abi sağolsun bu soruma cevap verdi.”GATHER_STATS_JOB” çalışır duruma getirirsek Oracle gerekli olan durumlarda kendisi istatistikleri kendisi topluyor.Peki bu JOB ın aktif olup olmadıgını nasıl anlarız?
Aşağıdaki sorguda “enabled” alanı TRUE ise aktif demektir.

SELECT owner, job_name, enabled
FROM dba_scheduler_jobs
WHERE job_name = ‘GATHER_STATS_JOB’
Aktif değilse “dbms_scheduler.enable(’GATHER_STATS_JOB’); ” komutunu çalıştırmamız yeterli.

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>