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 và 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ê