Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Cơ Sở Dữ Liệu

Cách Khôi Phục Thống Kê Oracle Database Để Tối Ưu Hóa Hiệu Suất

Giới thiệu

Bài viết blog này khám phá khi nào và làm thế nào bạn có thể khôi phục thống kê trong Oracle® Database.

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 bộ tối ưu hóa thực thi các kế hoạch thực thi không tối ưu. Trong những trường hợp đó, bạn có thể muốn khôi phục thống kê từ thời điểm mà hiệu suất tốt hơn.

Tuy nhiên, các phiên bản khác nhau của Oracle Database có những thay đổi nhỏ về cách chúng xử lý thống kê:

  • Oracle 10g bắt đầu tự động bảo toàn thống kê để dễ dàng khôi phục.
  • Từ 11.1 trở đi, Oracle giới thiệu cách tốt hơn, cho phép bạn trì hoãn xuất bản thống kê.

Các lý do có thể gây ra hiệu suất thống kê kém

Bạn có thể thấy cần thu thập thống kê để đảm bảo bộ tối ưu hóa chọn các kế hoạch thực thi tối ưu, nhưng việc thu thập thống kê làm vô hiệu hóa biểu diễn đã phân tích của câu lệnh SQL. Ngoài ra, việc phân tích lại câu lệnh sau khi thu thập thống kê có thể khiến bộ tối ưu hóa chọn một kế hoạch thực thi khác và kém tối ưu hơn kế hoạch ban đầu.

Trong Oracle 10g và mới hơn, bạn có thể khôi phục thống kê bằng cách sử dụng gói dbms_stats, cho phép bạn tùy chọn khôi phục thống kê và xuất khẩu thống kê.

Theo mặc định, Oracle giữ 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 hiển thị lệnh SQL để hiển thị kỳ giữ hiện tại:

Cách Khôi Phục Thống Kê Oracle Database Để Tối Ưu Hóa Hiệu Suất

Để thay đổi kỳ giữ, hãy chạy lệnh sau, trong đó xx là số ngày bạn muốn sử dụng:

SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (xx)

Truy vấn sau giúp bạn hiểu dữ liệu thống kê lịch sử nào bạn có thể khôi phục:

Cách Khôi Phục Thống Kê Oracle Database Để Tối Ưu Hóa Hiệu Suất

Lưu ý: Ví dụ này hiển thị thống kê từ ngày trước đó và sau này.

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.

Đầu tiên, xác định 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 MY_TABLE đã được phân tích nhiều lần trong vài ngày qua. Để khôi phục thống kê bảng của bảng được thu thập vào 21-DEC-19 10.10.18.725917 PM -05:00, hãy 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ê schema

Ví dụ này trình bày cách khôi phục thống kê schema từ một ngày trước.

Để khôi phục thống kê schema của bảng được thu thập vào 21-DEC-19 10.10.18.725917 PM -05:00, hãy 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ê schema có sẵn cho AS_OF_TIMESTAMP, hãy chạy lệnh sau và chọn ngày phù 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à schema. Danh sách sau hiển thị tất cả các thực thể mà bạn có thể khôi phục thống kê trước đó:

  • TABLE_STATS
  • SCHEMA_STATS
  • DATABASE_STATS
  • DICTIONARY_STATS
  • FIXED_OBJECTS_STATS
  • SYSTEM_STATS

Xuất khẩu thống kê bạn muốn lưu

Bạn cũng có thể xuất khẩu thống kê bạn muốn lưu hoặc xuất khẩu thống kê hiện tại trước khi thực hiện 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:

    Exec dbms_stats.create_stat_table(ownname => 'MYSELF', stattab => 'MYSELF_STATS_',tblspace => '');

    ownname: tên chủ sở hữu stattab: tên bảng dưới user MYSELF để tạo tblspace: tablespace dưới đó để tạo bảng này

  2. Xuất khẩu thống kê trong bảng trước đó bằng cách chạy lệnh tương tự như ví dụ sau:

    exec dbms_stats.export_table_stats('SCHEMA1','TAB1',NULL,'STATS','TAG1_TAB1',TRUE);

    Ví dụ:

    Exec dbms_stats.export_database_stats(statown => 'MYSELF', stattab => 'MYSELF_STATS');

Kết luận

Thông tin và truy vấn trong bài viết 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, Schema, Fixed_Object, Hệ thống và Từ điển) về một ngày quá khứ hợp lý, đảm bảo hiệu suất cơ sở dữ liệu mượt mà.

Sử dụng tab Feedback để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi. Bạn cũng có thể trò chuyện ngay để bắt đầu cuộc hội thoại.

Tìm hiểu thêm về dịch vụ Cơ sở dữ liệu của chúng tôi