Số liệu thống kê có thể trở nên cũ khi dữ liệu trong bảng thay đổi đáng kể. Số liệu thống kê cập nhật rất quan trọng để tạo ra các kế hoạch thực thi tốt
Cách Oracle quyết định xem số liệu thống kê đã cũ chưa
Số liệu thống kê được coi là cũ khi # (INSERTS + UPDATES + DELETES)> =10% trong tổng số NUM_ROWS từ dba_tables:
Cần cài đặt thông số để Theo dõi các thay đổi của bảng
Trước Oracle 10g, việc thu thập thống kê tự động cho các đối tượng đã cũ được kiểm soát bằng cách cài đặt cờ THEO DÕI trên bảng.
Tùy thuộc vào cờ MONITORING, công việc GATHER_STATS_JOB đã thu thập “GATHER EMPTY” và “GATHER STALE” trên các đối tượng được gắn cờ.
Sau 10g, các từ khóa THEO DÕI và NOMONITORING không được dùng nữa và sẽ bị bỏ qua. Tính năng giám sát bảng hiện được kiểm soát bởi thông số STATISTICS_LEVEL.
Khi STATISTICS_LEVEL được đặt thành BASIC, tính năng giám sát sẽ bị tắt trên bảng.
Khi STATISTICS_LEVEL được đặt thành TYPICAL, thì tính năng giám sát được bật.
Theo mặc định, STATISTICS_LEVEL được đặt thành TYPICAL và giám sát bảng được bật. Chúng tôi thực sự khuyên bạn nên đặt STATISTICS_LEVEL thành TYPICAL trong 10g trở lên
Bằng cách đặt tham số này, Oracle theo dõi số lượng gần đúng các hoạt động INSERT, UPDATE và DELETE cho bảng oracle kể từ lần cuối cùng thống kê được thu thập. Thông tin về “các thay đổi đã thực hiện” này được duy trì trong SGA và định kỳ (khoảng 15 phút một lần) SMON chuyển dữ liệu vào các bảng từ điển dữ liệu. Bạn có thể xóa thông tin theo cách thủ công bằng cách gọi dbms_stats.FLUSH_DATABASE_MONITORING_INFO (). Thông tin từ điển dữ liệu được hiển thị qua các chế độ xem:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS và USER_TAB_MODIFICATIONS.
Oracle sử dụng các chế độ xem này để xác định các bảng có thống kê cũ.
Bất cứ khi nào có 10% thay đổi về dữ liệu trong bảng, Oracle sẽ coi thống kê của nó là cũ.
Cách kiểm tra thống kê cũ
Quy trình PLSQL dưới đây tìm ra tất cả các bảng trong lược đồ SCOTT là bảng thống kê cũ
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 dưới đây cũng có thể được sử dụng để tìm hiểu chèn, cập nhật, xóa
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 /
Nếu bạn muốn chạy điều này trên toàn bộ cơ sở dữ liệu
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; /
Nếu bạn muốn xem các bảng có số liệu thống kê trống, chúng tôi có thể sử dụng bên dưới
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; /
Bây giờ khi bạn tìm thấy danh sách bảng, bạn có thể tạo thống kê trên các bảng này.
exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');
Chúng ta cũng có thể chạy lệnh dưới đây để tạo số liệu thống kê trên tất cả các đối tượng cũ trong lược đồ
exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');
Bắt đầu với Oracle11g, ngưỡng ổn định có thể được đặt bằng cách sử dụng tùy chọn thống kê STALE_PERCENT. Điều này có thể được đặt trên toàn cầu bằng cách sử dụng DBMS_STATS.SET_GLOBAL_PREFS hoặc ở cấp bảng bằng cách sử dụng DBMS_STATS.SET_TABLE_PREFS.
Các bài viết có liên quan
ora-38029:thống kê đối tượng bị khóa
hoặc-20001 trong Thu thập thống kê giản đồ vào 11g (FND_HISTOGRAM_COLS)
Thu thập thống kê trong Bản phát hành 11i và R12
Thu thập thống kê gia tăng Thu thập trong 11g
Cách thực hiện đặt Giám sát bảng trong Oracle và Mối quan hệ với STATISTICS_LEVEL