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

Cách kiểm tra thống kê cũ

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL Oracle:Truy xuất các giá trị mới nhất cho mỗi nhóm dựa trên thời gian

  2. Cách lấy đối tượng Connection hiện tại trong Spring JDBC

  3. Làm thế nào để Kiểm tra xem tệp có phải là hình ảnh bằng PL / SQL hay không?

  4. Sự cố khối PL / SQL:Không tìm thấy dữ liệu lỗi

  5. Có cách nào để buộc OracleCommand.BindByName trở thành true theo mặc định cho ODP.NET không?