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

Tại sao Oracle sử dụng DBMS_STATS.GATHER_TABLE_STATS?

Hầu hết các cơ sở dữ liệu doanh nghiệp, bao gồm Oracle, sử dụng trình tối ưu hóa dựa trên chi phí để xác định kế hoạch truy vấn thích hợp cho một câu lệnh SQL nhất định. Điều này có nghĩa là trình tối ưu hóa sử dụng thông tin về dữ liệu để xác định cách thực thi truy vấn thay vì dựa vào các quy tắc (đây là điều mà trình tối ưu hóa dựa trên quy tắc cũ đã làm).

Ví dụ:hãy tưởng tượng một bảng cho một ứng dụng theo dõi lỗi đơn giản

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Nếu tôi là một công ty lớn, tôi có thể có 1 triệu hàng trong bảng này. Trong số đó, 100 có issue_status trong số ACTIVE, 10.000 có issue_status trong tổng số QUEUED và 989,900 có trạng thái HOÀN THÀNH. Nếu tôi muốn chạy một truy vấn đối với bảng để tìm các vấn đề đang hoạt động của mình

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

trình tối ưu hóa có một sự lựa chọn. Nó có thể sử dụng chỉ mục trên issue_status và sau đó thực hiện tra cứu một hàng trong bảng cho mỗi hàng trong chỉ mục phù hợp hoặc nó có thể thực hiện quét bảng về các vấn đề issues bàn. Gói nào hiệu quả hơn sẽ phụ thuộc vào dữ liệu có trong bảng. Nếu Oracle mong đợi truy vấn trả về một phần nhỏ dữ liệu trong bảng, thì việc sử dụng chỉ mục sẽ hiệu quả hơn. Nếu Oracle mong đợi truy vấn trả về một phần đáng kể dữ liệu trong bảng, thì việc quét bảng sẽ hiệu quả hơn.

DBMS_STATS.GATHER_TABLE_STATS là những gì thu thập các số liệu thống kê cho phép Oracle đưa ra quyết định này. Nó cho Oracle biết rằng có khoảng 1 triệu hàng trong bảng, rằng có 3 giá trị riêng biệt cho issue_status và dữ liệu được phân phối không đồng đều. Vì vậy, Oracle biết sử dụng một chỉ mục cho truy vấn để tìm tất cả các vấn đề đang hoạt động. Nhưng nó cũng biết điều đó khi bạn quay lại và cố gắng tìm kiếm tất cả các vấn đề đã đóng

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

rằng việc quét bảng sẽ hiệu quả hơn.

Thu thập số liệu thống kê cho phép các kế hoạch truy vấn thay đổi theo thời gian khi khối lượng dữ liệu và phân phối dữ liệu thay đổi. Khi bạn lần đầu tiên cài đặt trình theo dõi sự cố, bạn sẽ gặp rất ít sự cố ĐÃ HOÀN THÀNH và nhiều vấn đề HOẠT ĐỘNG và HỎI hơn. Theo thời gian, số lượng các vấn đề HOÀN THÀNH tăng lên nhanh chóng hơn nhiều. Khi bạn nhận được nhiều hàng hơn trong bảng và phần tương đối của các hàng ở các trạng thái khác nhau thay đổi, các kế hoạch truy vấn sẽ thay đổi để trong thế giới lý tưởng, bạn luôn có được kế hoạch hiệu quả nhất có thể.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao tôi bi quan Khóa JPA với Oracle không hoạt động

  2. Cách tạo sơ đồ mối quan hệ thực thể (ER) bằng Oracle SQL Developer

  3. Oracle cách xuất truy vấn sang tệp văn bản / csv

  4. java.lang.ClassCastException:oracle.sql.TIMESTAMP không thể truyền sang java.sql.Timestamp

  5. Cách xuất kết quả truy vấn Oracle sang tệp JSON khi sử dụng SQLcl