Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách tìm bảng nơi thống kê bị khóa

Số liệu thống kê đóng vai trò quan trọng trong việc điều chỉnh hiệu suất của Oracle. Oracle Optimizer tạo kế hoạch thực thi dựa trên thống kê của bảng tiên tri liên quan đến các truy vấn SQL.

Bạn có thể muốn khóa số liệu thống kê trong bảng tiên tri trong một số trường hợp, chẳng hạn như

  • bạn không muốn một bảng được phân tích theo lịch trình thống kê công việc nhưng muốn phân tích nó sau hoặc với ước tính cao hơn
  • bạn không muốn tạo thống kê cho bảng vì lý do hiệu suất
  • bạn không muốn máy chủ dành thời gian tạo thống kê khi dữ liệu bảng không thay đổi

Có thể có nhiều trường hợp khác mà chúng tôi muốn khóa số liệu thống kê

Mục lục

Cách khóa thống kê trên bảng

Bạn có thể sử dụng gói oracle chuẩn DBMS_STATS để khóa các thống kê trên bảng

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

Cách tìm bảng có thống kê bị khóa

Bạn có thể sử dụng truy vấn bên dưới để tìm tất cả các bảng có thống kê bị khóa

select owner, table_name, stattype_locked
from dba_tab_statistics
where stattype_locked is not null;

Đang chạy công việc tạo thống kê trên bảng có thống kê bị khóa

Nếu chúng tôi cố gắng chạy thu thập thống kê trên các bảng có thống kê bị khóa, chúng tôi nhận được thống kê đối tượng ORA-20005 bị khóa (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

Chúng tôi có thể thực hiện các bước dưới đây để mở khóa số liệu thống kê và tạo số liệu thống kê và khóa lại

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);

Cách mở khóa thống kê cho Bảng và lược đồ / mở khóa thống kê bảng cho lược đồ

Bây giờ khi chúng tôi tìm ra các đối tượng, chúng tôi có thể sử dụng các truy vấn dưới đây để mở khóa chúng

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');

Tạo chỉ mục với số liệu thống kê được khóa trên bảng

Từ 10g trở đi, bất cứ khi nào chúng ta tạo chỉ mục, thống kê sẽ được tạo tự động. Bây giờ phương trình này thay đổi Khi bảng bị khóa, thống kê sẽ không được tạo trong khi tạo chỉ mục. Chúng ta cần sử dụng tùy chọn FORCE để thu thập số liệu thống kê trong khi tạo chỉ mục cho các đối tượng bị khóa. Hãy hiểu chi tiết điều đó bằng cách xem ví dụ

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.

Hy vọng bạn thích thông tin về cách khóa / mở khóa bảng thống kê trong oracle. Ngoài ra Bây giờ bạn phải biết phải làm gì khi ORA-20005:thống kê đối tượng bị khóa ORA-38029:thống kê đối tượng bị khóa xảy ra

Các bài viết có liên quan
Thu thập thống kê trong Bản phát hành 11i và R12
Thu thập thống kê tăng dần trong 11g
hoặc-20001 trong Thu thập thống kê lược đồ vào 11g (FND_HISTOGRAM_COLS)
Cách đặt Giám sát bảng trong Oracle và Mối quan hệ với STATISTICS_LEVEL
Hướng dẫn Oracle:Cách kiểm tra thống kê Cũ
Chế độ Trình tối ưu hóa Oracle
Tài liệu Oracle về thống kê


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng Oracle JDeveloper 12c với Cơ sở dữ liệu Oracle, Phần 1

  2. Gặp lỗi ORA - 00907 ở phần sau khi BẬT CẬP NHẬT

  3. Gửi một mảng giá trị tới thủ tục Oracle để sử dụng trong mệnh đề WHERE IN

  4. Hàm NLS_COLLATION_ID () trong Oracle

  5. Hàm Group_concat MySQL tương đương trong Oracle