Trình tối ưu hóa nghĩ rằng việc quét toàn bộ bảng sẽ tốt hơn.
Nếu chỉ có một vài NULL
hàng, trình tối ưu hóa đúng.
Nếu bạn hoàn toàn chắc chắn rằng truy cập chỉ mục sẽ nhanh hơn (nghĩa là bạn có nhiều hơn 75%
các hàng có col1 IS NULL
), sau đó gợi ý truy vấn của bạn:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Tại sao lại là 75%
?
Bởi vì sử dụng INDEX SCAN
để truy xuất các giá trị không nằm trong chỉ mục ngụ ý một kết nối ẩn trên ROWID
, có giá khoảng 4
nhiều lần so với quét bảng.
Nếu phạm vi chỉ mục bao gồm nhiều hơn 25%
trong số các hàng, quá trình quét bảng thường nhanh hơn.
Như đã đề cập bởi Tony Andrews
, yếu tố phân cụm là phương pháp chính xác hơn để đo giá trị này, nhưng 25%
vẫn là một nguyên tắc chung.