Historydeki İstatistikleri Tekrar Nasıl Kullanabiliriz

Database’ inizde örneğin gather_stats_job’ ınız disable değil ise database’ in istatistikleri belli aralıklarla güncelleniyor demektir. Alınan her bir istatistik belli bir süre boyunca history’ de saklanır. Aslında bu özellik çok sık kullanılmamakla birlikte bazen çok işimize yarayabilmektedir.

Örneğin, çok büyük bir tablonuz var ve bir gün önce bu tablo üzerindeki tüm sorgularınızın performans şikayeti olmadan çalıştığını ancak şu anda sorguların büyük bir çoğunluğunun index kullanmadığını yani full table scan yaptığını farkettiniz. Bu durumun bir çok nedeni olabilir. Biz bunun nedenin istatistiklerde yaşanan bir problem den dolayı kaynaklandığını düşünelin veya bu ihtimal üzerinde duralım ve neler yapabiliriz onlar üzerinde konuşalım.

Öncelikle tablomuz çok büyük olduğundan dolayı ve gün içerisinde sıklıkla kullanıldığı için istatistiğini tekrar almamız çok mümkün olmayacaktır. Peki ne yapabiliriz, daha önce alınmış olan istatistikleri tekrar kullanabilirmiyiz? Evet, kullanabiliriz peki bunu nasıl yapacağız;

Öncelikle geçmişe dönük istatistikleri kaç gün sakladığımıza bakalım ;

SQL> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual

GET_STATS_HISTORY_RETENTION
—————————
31
1 row selected.

31 günlük istatistik historysini saklıyoruz. (Aynı zamanda bu default değerdir)
Bu değeri değiştirmek isterseniz aşağıdaki komutu kullanabilirsiniz;

SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (45)
PL/SQL procedure successfully completed.

Artık yeni değerimiz;

SQL> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual

GET_STATS_HISTORY_RETENTION
—————————
45
1 row selected.

30 günlük history saklıyoruz ama kullanılabilir history istatistiğimiz olup olmadığını kontrol etmek için ;

SQL> select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual;

GET_STATS_HISTORY_AVAILABILITY
———————————–
30-MAY-12 11.02.54.625000000 PM +03:00
1 row selected.

Hangi tablonun istatistiklerinin history’ de tutulduğunu görebilmek için, aşağıdaki scripti kullanabilirsiniz ;

select TABLE_NAME, STATS_UPDATE_TIME from dba_tab_stats_history;

Bu sorgu yüzlerce kayıt getirdiğinden dolayı biz sadece bizim tablomuz için çalıştırıp sonucuna bakalım ;

SQL> select TABLE_NAME, STATS_UPDATE_TIME from dba_tab_stats_history
where table_name = ‘SALES2’

TABLE_NAME STATS_UPDATE_TIME
—————————— ———————————–
SALES2 28-JUN-12 11.40.31.703000 PM +03:00
1 row selected.

Bu database’ de SALES2 tablosu için en 28 hazirana ait bir istatistiğimiz var. Bunu tekrar restore etmeye
çalışalım ;

SQL> begin
dbms_stats.restore_table_stats (
‘KAMIL’,
‘SALES2′,
’28-JUN-12 11.40.31.703000 PM +03:00’);
end;
PL/SQL procedure successfully completed.

Artık 28’ inde alınan istatistikleri tekrar kullanabiliriz.

Daha önce alınmış olup history’ de saklanan istatistikleri sadece tablo bazında aşağıdaki kriterleri
kullanarakda dönebilirsiniz ;

execute DBMS_STATS.RESTORE_TABLE_STATS (‘owner’,’table’,date)
execute DBMS_STATS.RESTORE_DATABASE_STATS(date)
execute DBMS_STATS.RESTORE_DICTIONARY_STATS(date)
execute DBMS_STATS.RESTORE_FIXED_OBJECTS_STATS(date)
execute DBMS_STATS.RESTORE_SCHEMA_STATS(‘owner’,date)
execute DBMS_STATS.RESTORE_SYSTEM_STATS(date)

Restore işlemi yaparken ;

SQL> begin
dbms_stats.restore_table_stats (
‘KAMIL’,
‘SALES2′,
’30-MAY-12 11.02.54.625000000 PM +03:00’);
end;

Error at line 1
ORA-20006: Unable to restore statistics , statistics history not available
ORA-06512: at “SYS.DBMS_STATS”, line 23760
ORA-06512: at “SYS.DBMS_STATS”, line 23779
ORA-06512: at line 2
Script Terminated on line 27.

ORA-20006 hatası alırsanız, bunun anlamı restore etmeye çalıştığınız zamana ait kullanılabilir bir istatistiğiniz olmadığı anlamına gelmektedir.

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


sekiz × 5 =