Nếu số liệu thống kê trên bảng của bạn là chính xác, thì rất ít khả năng trình tối ưu hóa sẽ chọn quét bảng thay vì sử dụng chỉ mục khóa chính khi bạn chỉ có 1000 phần tử được mã hóa cứng trong WHERE
mệnh đề. Cách tiếp cận tốt nhất là thu thập (hoặc thiết lập) số liệu thống kê chính xác về các đối tượng của bạn vì điều đó sẽ khiến những điều tốt đẹp tự động xảy ra thay vì cố gắng thực hiện nhiều bài tập thể dục để giải quyết các số liệu thống kê không chính xác.
Nếu chúng tôi giả định rằng thống kê không chính xác ở mức độ mà trình tối ưu hóa sẽ tin rằng việc quét bảng sẽ hiệu quả hơn so với việc sử dụng chỉ mục khóa chính, bạn có thể thêm vào DYNAMIC_SAMPLING
gợi ý rằng điều đó sẽ buộc trình tối ưu hóa thu thập số liệu thống kê chính xác hơn trước khi tối ưu hóa câu lệnh hoặc CARDINALITY
gợi ý để ghi đè ước tính số lượng mặc định của trình tối ưu hóa. Không ai trong số đó yêu cầu biết bất kỳ điều gì về các chỉ mục có sẵn, nó sẽ chỉ yêu cầu biết bí danh bảng (hoặc tên nếu không có bí danh). DYNAMIC_SAMPLING
sẽ là cách tiếp cận an toàn hơn, mạnh mẽ hơn nhưng sẽ thêm thời gian cho bước phân tích cú pháp.
Nếu bạn đang xây dựng một câu lệnh SQL với một số lượng thay đổi các tham số được mã hóa cứng trong IN
, bạn có thể sẽ tự tạo ra các vấn đề về hiệu suất bằng cách làm ngập nhóm chia sẻ của mình bằng SQL không thể chia sẻ và buộc cơ sở dữ liệu dành nhiều thời gian để phân tích cú pháp từng biến thể riêng biệt. Sẽ hiệu quả hơn nhiều nếu bạn tạo một câu lệnh SQL có thể chia sẻ duy nhất có thể được phân tích cú pháp một lần. Tùy thuộc vào nơi IN
của bạn giá trị mệnh đề đến từ, có thể trông giống như
SELECT *
FROM table_name
WHERE primary_key IN (SELECT primary_key
FROM global_temporary_table);
hoặc
SELECT *
FROM table_name
WHERE primary_key IN (SELECT primary_key
FROM TABLE( nested_table ));
hoặc
SELECT *
FROM table_name
WHERE primary_key IN (SELECT primary_key
FROM some_other_source);
Nếu bạn đã hiểu một câu lệnh SQL có thể chia sẻ duy nhất, thì ngoài việc tránh chi phí liên tục phân tích lại câu lệnh, bạn có một số tùy chọn để buộc một kế hoạch cụ thể không liên quan đến việc sửa đổi câu lệnh SQL. Các phiên bản khác nhau của Oracle có các tùy chọn khác nhau về độ ổn định của gói - có phác thảo được lưu trữ , Quản lý kế hoạch SQL và Cấu hình SQL trong số các công nghệ khác tùy thuộc vào bản phát hành của bạn. Bạn có thể sử dụng chúng để buộc các kế hoạch cụ thể cho các câu lệnh SQL cụ thể. Tuy nhiên, nếu bạn tiếp tục tạo các câu lệnh SQL mới phải được phân tích cú pháp lại, thì việc sử dụng các công nghệ này sẽ trở nên rất khó khăn.