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

Bagaimana menemukan tabel di mana statistik dikunci

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Peningkatan Otomatis untuk Oracle

  2. mengotomatiskan oracle skrip rollback

  3. Cara Membuat Kursor Ref Lemah PL/SQL Di Database Oracle

  4. SQL Query untuk menemukan baris yang hilang di antara dua tabel terkait

  5. Apa Itu Versi Utama?