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