Analiz İşlemleri
Tablo veya indexlerin ne zaman analiz edilmiş olduğunu görmek için;
|
1 2 |
SQL> select LAST_ANALYZED, t.* from user_tables t; SQL> select LAST_ANALYZED, i.* from user_indexes i; |
Tabloların ve Indexlerin Tamamının Analizini Yaptırmak İçin
Herhangi bir tablonun istatistik bilgilerinin toplanması için;
|
1 |
SQL> exec dbms_stats.gather_table_stats(ownname=>user, tabname=>'XXX', method_opt =>'for all columns size auto',cascade=> true, granularity => 'ALL'); |
|
1 2 3 4 5 6 7 |
Örnek EXEC DBMS_STATS.gather_schema_stats('SCOTT'); EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES'); EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES', estimate_percent => 15); EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK'); EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK', estimate_percent => 15); |
XXX tablosunun tüm partition ve subpartitionları (granularity = 'ALL’ olduğu için) ve tüm indexleri ile ilgili (cascade = true olduğu için) istatistik toplanmış oluyor.
XXX indexinin tüm partition ve subpartitionları (granularity = 'ALL’ olduğu için) ile ilgili istatistik toplanmış oluyor.
|
1 |
SQL> exec dbms_stats.gather_index_stats(ownname=>user, indname=>'XXX', granularity => 'ALL'); |
Tüm VT’nin istatistiğini almak için
|
1 |
dbms_stats.gather_database_stats(options=> 'GATHER AUTO'); |
Schema içindeki tüm tablolarla ilgili indexler ve partitionlar düzeyinde istatistik toplanmış oluyor.
|
1 |
SQL> exec dbms_stats.gather_schema_stats(ownname=>user, method_opt =>'for all columns size auto',cascade=> true, granularity => 'ALL'); |
Tablo veya schema ile ilgili tüm istatistikler siliniyor.
|
1 2 |
SQL>exec dbms_stats.delete_table_stats(ownname=>user, 'XXX') SQL>exec dbms_stats.delete_schema_stats(ownname=>user) |
Zamanlamak için (schedule)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'BEGIN DBMS_STATS.gather_schema_stats(''HR''); END;' ,next_date => to_date('25.09.2007 02:00:00','dd/mm/yyyy hh24:mi:ss') ,interval => 'SYSDATE + 1' ,no_parse => FALSE ); SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x)); COMMIT; END; / |
Zamanlamış görevi silmek için (jobs)
|
1 2 3 |
EXEC DBMS_JOB.remove(X); COMMIT; / |
Tabloda az sayıda row olduğunu düşünelim. Ancak Oracle’ın - örneğin CBO’nun - çok sayıda row olduğunda nasıl davranacağını görmek istiyoruz. Bu durumda istatistik değerlerini kendimiz belirleyebiliyoruz. Bunun için,
|
1 |
SQL> execute DBMS_STATS.SET_TABLE_STATS ( ownname => user, tabname => 'XXX', numrows => 1000000, numblks => 1000000); |
Bu durumda artık optimizer çok sayıda row olması durumunda ne yapacak bunu görebiliyoruz.
İstatik ve Histogram
|
1 2 3 |
begin dbms_stats.gather_dictionary_stats(options=> 'GATHER AUTO'); end; |
veya
|
1 2 3 |
begin dbms_stats.gather_schema_stats (ownname=> 'SYS' ,options=> 'GATHER AUTO'); end; |
Yöntem -A
Adım_1 Procedure oluşturulur.
|
1 2 3 4 5 6 7 8 9 10 11 |
create or replace procedure prc_tablo_istatistikleri_topla is cursor c_tablo is select table_name from user_tables; begin for r_tablo in c_tablo loop execute immediate 'analyze table ' || r_tablo.table_name || ' compute statistics'; dbms_output.put_line(r_tablo.table_name || ' analize edildi.'); end loop; end; |
exec tablo_istatistikleri_topla - şeklinde de çalıştırılabilir.
Adım_2 Zamanlanır (schedule)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DECLARE jobno NUMBER; BEGIN DBMS_JOB.submit (job => jobno, what => 'HR.prc_tablo_istatistikleri_topla;', next_date => trunc(sysdate)+23/24, interval => 'SYSDATE + 1', no_parse => TRUE ); DBMS_OUTPUT.put_line ('Created Job - the job number is:' || TO_CHAR (jobno)); COMMIT; END; / |
Yöntem -B
HR kullanıcısının tablo ve indekslerini hergün saat 23:00’da analize eder istatitiklerini toplar. Hangi şema ile yapılırsa onun için yapar.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Set SERVEROUT ON Set pagesize 200 DECLARE jobno NUMBER; BEGIN DBMS_JOB.submit (job => jobno, what => 'DBMS_STATS.gather_schema_stats(ownname => ''HR'', cascade => TRUE, estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE);', next_date => trunc(sysdate)+23/24, interval => 'SYSDATE + 1', no_parse => TRUE ); DBMS_OUTPUT.put_line ('Created Job - the job number is:' || TO_CHAR (jobno)); COMMIT; END; / |
Dakika belirtmek için;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
BEGIN SYS.DBMS_JOB.REMOVE(51); COMMIT; END; / DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'HR.TABLO_ISTATISTIKLERI_TOPLA;' ,next_date => to_date('01.09.2010 16:25:00','dd/mm/yyyy hh24:mi:ss') ,interval => 'TRUNC(SYSDATE+1)' ,no_parse => FALSE ); SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x)); COMMIT; END; / |
