Statistik dapat menjadi usang ketika data dalam tabel berubah secara substansial. Statistik terkini penting untuk menghasilkan rencana eksekusi yang baik
Bagaimana Oracle memutuskan apakah statistiknya menjadi basi
Statistik dianggap basi ketika #(INSERTS + UPDATES + DELETES)>=10% dari NUM_ROWS dari dba_tables:
Pengaturan parameter diperlukan untuk Melacak perubahan tabel
Sebelum Oracle 10g, pengumpulan statistik otomatis untuk objek yang telah basi dikendalikan oleh pengaturan flag MONITORING di atas meja.
Bergantung pada flag MONITORING, tugas GATHER_STATS_JOB mengumpulkan "GATHER EMPTY" dan "GATHER STALE" pada objek yang ditandai.
Dalam 10g, kata kunci MONITORING dan NOMONITORING tidak digunakan lagi dan akan diabaikan.Fitur pemantauan tabel sekarang dikontrol oleh parameter STATISTICS_LEVEL.
Ketika STATISTICS_LEVEL diatur ke BASIC, pemantauan dinonaktifkan pada tabel.
Bila STATISTICS_LEVEL diatur ke TYPICAL, maka pemantauan diaktifkan.
Secara default STATISTICS_LEVEL diatur ke TYPICAL dan pemantauan tabel diaktifkan. Sangat disarankan untuk menyetel STATISTICS_LEVEL ke TYPICAL dalam 10g ke atas
Dengan menyetel parameter ini, Oracle melacak perkiraan jumlah operasi INSERT, UPDATE, dan DELETE untuk tabel oracle sejak terakhir kali statistik dikumpulkan. Informasi tentang "perubahan yang dibuat" ini disimpan di SGA dan secara berkala (sekitar setiap 15 menit) SMON mem-flush data ke dalam tabel kamus data. Anda dapat menghapus informasi secara manual dengan memanggil dbms_stats.FLUSH_DATABASE_MONITORING_INFO(). Informasi kamus data dibuat terlihat melalui tampilan:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS dan USER_TAB_MODIFICATIONS.
Oracle menggunakan tampilan ini untuk mengidentifikasi tabel yang memiliki statistik basi.
Setiap kali ada 10% perubahan data dalam tabel, Oracle menganggap statistiknya basi.
Cara memeriksa statistik Kedaluwarsa
Prosedur PLSQL di bawah ini menemukan semua tabel dalam skema SCOTT yang merupakan statistik basi
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT', objlist=>ObjList, options=>'LIST STALE'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Sql di bawah ini juga dapat digunakan untuk mengetahui insert, update, delete
select u.TIMESTAMP, t.last_analyzed, u.table_name, u.inserts, u.updates, u.deletes, d.num_rows, decode(d.num_rows,0,'Table Stats indicate No Rows', nvl(TO_CHAR(((U.inserts+u.deletes+u.updates)/d.num_rows) * 100,'999.99') ,'Null Value in USER_TAB_MODIFICATIONS') ) percent from user_tables t,USER_TAB_MODIFICATIONS u,dba_tables d where u.table_name = t.table_name and d.table_name = t.table_name and d.owner = '&Owner' and (u.inserts > 3000 or u.updates > 3000 or u.deletes > 3000) order by t.last_analyzed /
Jika Anda ingin menjalankan ini di seluruh database
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST STALE'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Jika Anda ingin melihat tabel di mana statistik kosong, kita dapat menggunakan di bawah ini
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST EMPTY'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Sekarang setelah Anda menemukan daftar tabel, Anda dapat membuat statistik pada tabel ini.
exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');
Kami juga dapat menjalankan perintah di bawah ini untuk menghasilkan statistik pada semua objek basi dalam skema
exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');
Dimulai dengan Oracle11g, ambang batas staleness dapat diatur menggunakan preferensi statistik STALE_PERCENT. Ini dapat diatur secara global menggunakan DBMS_STATS.SET_GLOBAL_PREFS atau pada tingkat tabel menggunakan DBMS_STATS.SET_TABLE_PREFS.
Artikel Terkait
ora-38029:statistik objek dikunci
ora-20001 di Kumpulkan statistik skema pada 11g(FND_HISTOGRAM_COLS)
Mengumpulkan Statistik di Rilis 11i dan R12
Pengumpulan Statistik Inkremental dalam 11g
Cara mengatur Pemantauan Tabel di Oracle dan Hubungan dengan STATISTICS_LEVEL