Index
İndex doğruluk Kontrolü
|
1 |
ANALYZE INDEX orders_region_id_idx VALIDATE STRUCTURE; ===> index_stats |
|
1 2 3 |
SELECT blocks, pct_used, distinct_keys lf_rows, del_lf_rows FROM index_stats; |
BLOCKS PCT_USED LF_ROWS DEL_LF_ROWS
- -- -- --
25 11 14 0
1 row selected.
Burada dikkat etmemiz gereken DEL_LF_ROWS’un LF_ROWS’e oranı % 30 u geçtiği zaman index analiz edilmeli ve yeniden kontrol edilip oluşturulmalıdır.
|
1 |
DROP INDEX hr.deptartments_name_idx; |
İndex kullanımının nasıl olduğunu gözlemlemek istiyorsak,
Başlangıçta,
|
1 |
ALTER INDEX summit.orders_id_idx MONITORING USAGE; |
Daha sonra V$OBJECT_USAGE’den aşağıdaki kolon bilgilerini alabiliriz.
INDEX_NAME: İndex İsmi
TABLE_NAME: Tablo İsmi
MONITORING: Monitör durumu ON / OFF
USED: YES / NO Monitoring boyunca index’in kullanılıp kullanılmadığı
START_MONITORING: Monitoring başlamış
END_MONITORING: Monitoring bitmiş
Monitoring’i tamamlamak içinde
|
1 |
ALTER INDEX summit.orders_id_idx NOMONITORING USAGE; |
İndexler compress edilerek yani skıştırılarak üzerlerinde yeteri kadar yer açılabilir.
|
1 2 |
create index emp_last_name_idx on employees (last_name, first_name) compress; alter index emp_last_name_idx rebuild compress; |
İndexler hakkında detaylı bilgi için aşağıdaki view/tablo lar incelenir.
|
1 2 3 4 |
DBA_INDEXES DBA_IND_COLUMNS DBA_IND_EXPRESSIONS V$OBJECT_USAGE |
|
1 |
select index_name, last_analyzed, num_rows, sample_size from user_indexes where table_name = ‘table_name’ ; |
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 :
|
1 |
DBMS_STATS.GATHER_INDEX_STATS (‘SEMANIZIN_ADI’,’INDEKSINIZIN_ADI’); |
Bir diğer yöntem daha indeks oluşturma aşamasında bunu isteyebiliriz :
|
1 |
create index INDEKS_ADI ………. compute statistics; |
Zaman zaman indekslerinde “rebuild” ihtiyacı olabilir.Bunu sağlarken aynı zamanda indeks istatistiği de toplayabiliriz.
|
1 |
alter index INDEKS_ADI rebuild compute statistics; |
Ama 10g ile birlikte daha indeks oluşturulma aşamasında istatistik toplanmakta.Örnekle görelim :
|
1 2 3 |
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); |
|
1 |
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
Tablo üzerinde işlem yapıldıkça istatistikler güncellenmez.Test Edelim;
|
1 |
insert into ttest select object_id, object_name, object_type from all_objects; |
|
1 2 3 |
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 |
“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 :
|
1 2 3 4 |
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 |
Bunu otomatiğe almak için. ”GATHER_STATS_JOB” çalışır duruma getirilirse Oracle gerektiğinde otomatik olarak istatistikleri topluyor. Aktif olup olmadığını aşağıdaki sorgu ile öğrenebiliriz. (true ise aktiftir.)
|
1 2 3 |
SELECT owner, job_name, enabled FROM dba_scheduler_jobs WHERE job_name = ‘GATHER_STATS_JOB’Aktif değilse “dbms_scheduler.enable(’GATHER_STATS_JOB’); |
eski index silinip yenisi oluşturulmaktadır.Böylece index yeniden oluşturulduğu için performans artacaktır.
normalde rebuilde edilen indexler tablolarda lock oluştururdu,bu yöntemle lock minimuma indirilmiştir.
|
1 2 3 4 |
ALTER INDEX orders_id_idx DEALLOCATE UNUSED ALTER INDEX orders_region_id_idx REBUILD TABLESPACE indx02; ALTER INDEX orders_id_idx REBUILD ONLINE; ALTER INDEX orders_id_idx COALESCE; |
indexteki parçalanma derecesin görmek için
|
1 |
validate index index_adı ; --> bu komit ile bilgiler index_stats a yazılır. |
aşağıdaki sorgu ile incelenir
|
1 2 3 4 5 |
select name "index adı", del_LF_rows "silinip doldurulmamış satırlar" , LF_rows "toplam index satırı" , round ((del_LF_rows / (LF_rows + 0.0000000001)) * 100) "parçalanma oranı" from index_stats; |
Parçalanma oranı yüksek ise
|
1 |
alter index index_adı rebuild ; ile yeniden yapılandırılır. |
Bir kullanıcıya ait tablonun indexlerini bulmak için
|
1 2 3 4 5 6 7 |
select a.index_name , b.index_type , a.column_name from user_ind_columns a , user_indexes b where a.table_name = 'hr.employees' and a.index_name = b.index_name order by a.index_name ; |
