Tablo veya indexlerin ne zaman analiz edilmiş olduğunu görmek için;
{code class=”brush: xml;”}
SQL> select LAST_ANALYZED, t.* from user_tables t;
SQL> select LAST_ANALYZED, i.* from user_indexes i;
{/code}
Tabloların ve Indexlerin Tamamının Analizini Yaptırmak İçin
Herhangi bir tablonun istatistik bilgilerinin toplanması için;
{code class=”brush: xml;”}
SQL> exec dbms_stats.gather_table_stats(ownname=>user, tabname=>’XXX’, method_opt =>’for all columns size auto’,cascade=> true, granularity => ‘ALL’);
Ö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);
{/code}
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.
{code class=”brush: xml;”}
SQL> exec dbms_stats.gather_index_stats(ownname=>user, indname=>’XXX’, granularity => ‘ALL’);
{/code}
Tüm VT’nin istatistiğini almak için
{code}
dbms_stats.gather_database_stats(options=> ‘GATHER AUTO’);
{/code}
Schema içindeki tüm tablolarla ilgili indexler ve partitionlar düzeyinde istatistik toplanmış oluyor.
{code class=”brush: xml;”}
SQL> exec dbms_stats.gather_schema_stats(ownname=>user, method_opt =>’for all columns size auto’,cascade=> true, granularity => ‘ALL’);
{/code}
Tablo veya schema ile ilgili tüm istatistikler siliniyor.
{code class=”brush: xml;”}
SQL>exec dbms_stats.delete_table_stats(ownname=>user, ‘XXX’)
SQL>exec dbms_stats.delete_schema_stats(ownname=>user)
{/code}
Zamanlamak için (schedule)
{code class=”brush: xml;”}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;
/{/code}
Zamanlamış görevi silmek için (jobs)
{code class=”brush: xml;”}EXEC DBMS_JOB.remove(X);
COMMIT;
/{/code}
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,
{code class=”brush: xml;”}
SQL> execute DBMS_STATS.SET_TABLE_STATS ( ownname => user, tabname => ‘XXX’, numrows => 1000000, numblks => 1000000);
{/code}
Bu durumda artık optimizer çok sayıda row olması durumunda ne yapacak bunu görebiliyoruz.
İstatik ve Histogram
{code class=”brush: xml;”}begin
dbms_stats.gather_dictionary_stats(options=> ‘GATHER AUTO’);
end;
veya
begin
dbms_stats.gather_schema_stats (ownname=> ‘SYS’ ,options=> ‘GATHER AUTO’);
end;{/code}
Yöntem -A
Adım_1 Procedure oluşturulur.
{code class=”brush: xml;”}
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;
{/code}
{code class=”brush: xml;”}
exec tablo_istatistikleri_topla — şeklinde de çalıştırılabilir.
{/code}
Adım_2 Zamanlanır (schedule)
{code class=”brush: xml;”}
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;
/
{/code}
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.
{code class=”brush: xml;”}
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;
/
{/code}
Dakika belirtmek için;
{code class=”brush: xml;”}
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;
/
{/code}
{jcomments on}