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.