Bài đăng trên blog này khám phá khi nào và cách bạn có thể khôi phục số liệu thống kê trong Oracle®Database.
Giới thiệu
Là một quản trị viên cơ sở dữ liệu (DBA), bạn có thể thường thấy rằng việc thu thập thống kê mới dẫn đến trình tối ưu hóa thực hiện các kế hoạch thực thi dưới mức tối ưu. Trong thosecases, bạn có thể muốn khôi phục số liệu thống kê từ thời điểm mà hiệu suất hoạt động tốt hơn.
Tuy nhiên, các phiên bản khác nhau của Cơ sở dữ liệu Oracle có những thay đổi nhỏ trong cách chúng xử lý số liệu thống kê:
- Oracle 10g đã bắt đầu tự động lưu giữ các số liệu thống kê để dễ dàng khôi phục.
- Trong phiên bản 11.1 và mới hơn, Oracle đã giới thiệu một cách tốt hơn, cho phép bạn hủy bỏ thống kê xuất bản.
Các lý do có thể có của hiệu suất thống kê kém
Bạn có thể thấy cần thiết phải thu thập số liệu thống kê để đảm bảo rằng bộ tối ưu hóa lựa chọn các kế hoạch thực thi tối ưu, nhưng việc thu thập số liệu thống kê sẽ làm mất hiệu lực biểu diễn theo phân tích của câu lệnh SQL. Ngoài ra, việc kiểm tra lại các số liệu thống kê sau khi tổng hợp lại câu lệnh có thể khiến trình tối ưu hóa chọn một kế hoạch thực thi khác và ít được tối ưu hóa hơn so với kế hoạch ban đầu.
Trong Oracle 10g trở lên, bạn có thể khôi phục số liệu thống kê bằng cách sử dụng dbms_stats , cung cấp cho bạn tùy chọn để khôi phục số liệu thống kê và xuất số liệu thống kê.
Theo mặc định, Oracle giữ lại số liệu thống kê lịch sử trong 31 ngày, nhưng bạn có thể thay đổi khoảng thời gian đó.
Hình ảnh sau đây cho thấy lệnh SQL để hiển thị khoảng thời gian lưu giữ hiện tại:
Để thay đổi khoảng thời gian lưu giữ, hãy chạy lệnh sau, trong đó xx sau đó là số ngày bạn muốn sử dụng:
SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (xx)
Truy vấn sau đây giúp bạn hiểu bạn có thể lưu trữ số liệu thống kê dữ liệu lịch sử nào:
Lưu ý: Ví dụ này hiển thị thống kê từ dữ liệu được đề cập trước đó và sau đó.
Khôi phục thống kê bảng
Ví dụ này trình bày cách khôi phục thống kê bảng từ một ngày trước đó.
Trước tiên, hãy xác định những thống kê nào có sẵn bằng cách chạy lệnh sau:
SQL> select TABLE_NAME, STATS_UPDATE_TIME from dba_tab_stats_history where table_name like 'MY_TABLE' and owner='MYSELF' order by 2;
TABLE_NAME STATS_UPDATE_TIME
--------------- --------------------------------------
MY_TABLE 20-DEC-19 05.32.26.887184 AM -05:00
MY_TABLE 20-DEC-19 10.10.19.361091 PM -05:00
MY_TABLE 21-DEC-19 05.32.14.475934 AM -05:00
MY_TABLE 21-DEC-19 10.10.18.725917 PM -05:00
MY_TABLE 22-DEC-19 10.10.17.841143 PM -05:00
MY_TABLE 23-DEC-19 05.32.56.168779 AM -05:00
MY_TABLE 23-DEC-19 10.10.23.633939 PM -05:00
MY_TABLE 24-DEC-19 05.32.14.082730 AM -05:00
MY_TABLE 24-DEC-19 10.10.21.712948 PM -05:00
MY_TABLE 25-DEC-19 05.32.13.710159 AM -05:00
MY_TABLE 25-DEC-19 10.10.17.836929 PM -05:00
MY_TABLE 26-DEC-19 05.32.14.545533 AM -05:00
MY_TABLE 26-DEC-19 10.10.12.808687 PM -05:00
MY_TABLE 27-DEC-19 05.32.13.779967 AM -05:00
Bạn có thể thấy rằng MY_TABLE đã được phân tích nhiều lần trong vài ngày qua. Để khôi phục số liệu thống kê của bảng được thu thập vào 21-DEC-19 10.10.18.725917 PM -05:00 , chạy lệnh sau:
SQL> execute dbms_stats.restore_table_stats('MYSELF','MY_TABLE','21-DEC-19 10.10.18.725917 PM -05:00');
PL/SQL procedure successfully completed.
Khôi phục thống kê giản đồ
Ví dụ này trình bày cách khôi phục thống kê lược đồ từ một ngày trước đó.
Để khôi phục thống kê giản đồ của bảng được thu thập vào 21-DEC-19 10.10.18.725917 PM -05:00 , chạy lệnh sau:
SQL> exec dbms_stats.restore_schema_stats(ownname=>'MYSELF', AS_OF_TIMESTAMP=>'21-DEC-19 10.10.18.725917 PM -05:00');
Để tìm các tùy chọn thống kê giản đồ có sẵn cho AS_OF_TIMESTAMP , chạy lệnh sau và chọn ngày thích hợp để khôi phục:
select count(*), stats_update_time from dba_tab_stats_history where owner='MYSELF'group by stats_update_time;
Khôi phục các thống kê khác
Bạn đã thấy cách khôi phục thống kê bảng và giản đồ. Danh sách sau đây cho thấy tất cả các thực thể mà bạn có thể khôi phục số liệu thống kê trước đó:
- TABLE_STATS
- SCHEMA_STATS
- DATABASE_STATS
- DICTIONARY_STATS
- FIXED_OBJECTS_STATS
- SYSTEM_STATS
Xuất các thống kê mà bạn muốn lưu
Bạn cũng có thể xuất các thống kê mà bạn muốn lưu hoặc xuất các thống kê hiện tại trước khi thực hiện các thay đổi bằng cách thực hiện các bước sau:
-
Tạo bảng thống kê bằng cách chạy lệnh tương tự như ví dụ sau:
Thực thi dbms_stats.create_stat_table (ownname => ‘MYSELF’, stattab => ‘MYSELF_STATS_
', tblspace =>‘ ');
tên riêng: tên chủ sở hữu stattab: tên bảng trong MYSELF của người dùng để tạo tblspace: không gian bảng để tạo bảng này
Xuất thống kê trong bảng trước bằng cách chạy lệnh tương tự như ví dụ sau:
execute dbms_stats.export_table_stats (‘SCHEMA1’, ‘TAB1’, NULL, ‘STATS’, ‘TAG1_TAB1’, TRUE);
Ví dụ:
Thực thi dbms_stats.export_database_stats (statown => ‘MYSELF’, stattab => ‘MYSELF_STATS’);
Kết luận
Thông tin và truy vấn trong bài đăng này giúp bạn khôi phục tất cả các loại thống kê cơ sở dữ liệu (Bảng, Cơ sở dữ liệu, Lược đồ, Fixed_Object, System vàDictionary) về một ngày hợp lý trước đây, đảm bảo cơ sở dữ liệu hoạt động trơn tru.
Sử dụng tab Phản hồi để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi nào. Bạn cũng có thể trò chuyện ngay bây giờ để bắt đầu cuộc trò chuyện.
Tìm hiểu thêm về các dịch vụ Cơ sở dữ liệu của chúng tôi