Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Khôi phục số liệu thống kê trong Cơ sở dữ liệu Oracle

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:

Khôi phục số liệu thống kê trong Cơ sở dữ liệu Oracle

Để 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:

Khôi phục số liệu thống kê trong Cơ sở dữ liệu Oracle

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:

  1. 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

  2. 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’);

  3. 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