Statistik memainkan peran kunci untuk penyetelan kinerja Oracle. Oracle Optimizer membuat rencana eksekusi berdasarkan statistik tabel oracle yang terlibat dalam kueri SQL.
Anda mungkin ingin mengunci statistik dalam tabel oracle dalam beberapa kasus, misalnya
- Anda tidak ingin tabel dianalisis berdasarkan tugas statistik jadwal, tetapi ingin menganalisisnya nanti atau dengan perkiraan yang lebih tinggi
- Anda tidak ingin membuat statistik untuk tabel karena alasan performa
- Anda tidak ingin server menghabiskan waktu menghasilkan statistik saat data tabel tidak berubah
Mungkin ada lebih banyak kasus di mana kami ingin mengunci statistik
Daftar Isi
Cara mengunci statistik pada tabel
Anda dapat menggunakan paket oracle standar DBMS_STATS untuk mengunci statistik pada tabel
exec dbms_stats.lock_table_stats('table_owner','table_name');
Example SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–------------ exec dbms_stats.lock_table_stats('TEST','TECH'); SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–-------- ALL
Cara menemukan tabel tempat statistik dikunci
Anda dapat menggunakan kueri di bawah ini untuk menemukan semua tabel tempat statistik dikunci
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Menjalankan Tugas pembuatan statistik di tabel tempat statistik dikunci
Jika kami mencoba menjalankan pengumpulan statistik pada tabel tempat statistik dikunci, kami mendapatkan ORA-20005 statistik objek terkunci (stattype =all)
SQL> exec dbms_stats.gather_table_stats('TECH', 'TEST'); BEGIN dbms_stats.gather_table_stats('TECH', 'TEST'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at “SYS.DBMS_STATS”, line 10640 ORA-06512: at “SYS.DBMS_STATS”, line 10664 ORA-06512: at line 1
Kami dapat melakukan langkah-langkah di bawah ini untuk membuka kunci statistik dan menghasilkan statistik dan mengunci lagi
exec dbms_stats.unlock_table_stats('TECH','TEST'); exec dbms_stats.gather_table_stats('TECH', 'TEST'); exec dbms_stats.lock_table_stats('TECH','TEST'); or exec dbms_stats.gather_table_stats('TECH', 'TEST',force=>true);
Cara membuka statistik untuk Tabel dan skema /membuka statistik tabel untuk skema
Sekarang setelah kita menemukan objeknya, kita dapat menggunakan kueri di bawah ini untuk membukanya
unlock table stats for schema exec dbms_stats.unlock_schema_stats('schema_owner'); exec dbms_stats.unlock_table_stats('table_owner','table_name'); Example exec dbms_stats.unlock_schema_stats('TECH'); exec dbms_stats.unlock_table_stats('TECH','TEST');
Pembuatan indeks dengan statistik terkunci di atas meja
10g dan seterusnya, setiap kali kita membuat indeks, statistik dihasilkan secara otomatis. Sekarang persamaan ini berubah Ketika tabel dikunci, statistik tidak akan dihasilkan saat membuat indeks. Kita perlu menggunakan opsi FORCE untuk mengumpulkan statistik sambil membuat indeks untuk objek yang terkunci. Mari kita pahami itu secara detail dengan melihat contoh
Example Lets first create the dummy table and lock the statistics on that table SQL> create table test as select a.* ,rownum id from all_objects a where rownum <1001; SQL> exec dbms_stats.lock_table_stats('TECH','TEST'); Now we will try to create index SQL> create index test_idx on test(id); Index created. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='TEST_IDX'; NUM_ROWS LAST_ANAL ---------- --------- So statistics on index is not generated automatically for the locked statistics table Lets try to generate the statistics using DBMS_STATS SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX'); BEGIN dbms_stats.gather_index_stats(null, 'TEST_IDX'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 10640 ORA-06512: at "SYS.DBMS_STATS", line 10664 ORA-06512: at line 1 So statistics generation failed. In order to generate stats on the index, We can use force option in dbms_stats to override this SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX',force=>true); PL/SQL procedure successfully completed. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='IDX'; NUM_ROWS LAST_ANAL ---------- --------- 1000 01-SEP-17 Lets try to create a new index with compute statistics clause SQL> create index TEST_IDX1 on test(object_name) compute statistics; create index idx on test(object_name) compute statistics * ERROR at line 1: ORA-38029: object statistics are locked So ORA-38029 error happens, So we need to create index with out the compute statistics clause and then generate stats using force option SQL> create index TEST_IDX1 on test(object_name); SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); Same things happens if we rebuild the index with compute statistics option SQL> alter index TEST_IDX1 rebuild compute statistics; alter index TEST_IDX1 rebuild compute statistics * ERROR at line 1: ORA-38029: object statistics are locked SQL> alter index TEST_IDX1 rebuild; Index altered. SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); PL/SQL procedure successfully completed.
Semoga Anda menyukai informasi tentang cara mengunci/membuka kunci statistik tabel di oracle. Juga Sekarang Anda harus tahu apa yang harus dilakukan ketika ORA-2005:statistik objek dikunci dan ORA-38029:statistik objek terkunci terjadi
Artikel Terkait
Pengumpulan Statistik di Rilis 11i dan R12
Pengumpulan Statistik Inkremental di 11g
ora-20001 di Kumpulkan statistik skema di 11g(FND_HISTOGRAM_COLS)
Cara mengatur Pemantauan Tabel di Oracle dan Hubungannya dengan STATISTICS_LEVEL
Tutorial Oracle:Cara memeriksa statistik Kedaluwarsa
Mode Pengoptimal Oracle
Dokumentasi Oracle tentang statistik