Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara memeriksa statistik basi

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rasa puas diri mengarah pada:Risiko Menjadi Kenyataan

  2. Memahami Java Oracle di Mac

  3. Dimana Patch saya?

  4. C#:Berikan tipe yang ditentukan pengguna ke prosedur tersimpan Oracle

  5. Cara Mengenkripsi Data di Oracle Menggunakan PL SQL