Bạn nói CAMPO47 có tính chọn lọc cao. Nhưng bạn chỉ lọc IS NOT NULL. Vì vậy, không quan trọng nó có bao nhiêu giá trị khác biệt, trình tối ưu hóa sẽ không sử dụng nó làm điểm nhập.
Và nó có chọn lọc như thế nào? Như bạn có thể thấy từ các cấp số trong sơ đồ giải thích, chọn trên STATO ='SC' sẽ tìm thấy 12856 hàng trong bảng của bạn. 12702 trong số các hàng đó hiển nhiên có CAMPO47 với một giá trị, do đó, chỉ có 154 hàng được lọc ra bằng bài kiểm tra để tìm giá trị rỗng. Nếu trình tối ưu hóa đã làm đầy đủ cho chỉ số trên CAMPO47 thì bao nhiêu hàng sẽ trả về? Có thể là nhiều hơn nữa.
Trình tối ưu hóa chỉ có thể sử dụng một chỉ mục đống để truy cập các hàng trên bảng. (Cơ chế khác nhau đối với các chỉ mục bitmap khi chúng đang áp dụng một phép biến đổi hình sao). Vì vậy, nếu bạn nghĩ rằng các quyền truy cập bảng bổ sung là một gánh nặng không thể giải quyết được thì bạn có một lựa chọn:một chỉ mục kết hợp. Nếu STATO thực sự không được chọn (tương đối ít hàng) thì bạn có thể an toàn trong việc thay thế chỉ mục hiện có bằng chỉ mục trên (STATO, CAMPO47).
Có một thủ thuật cũ để thúc đẩy cơ sở dữ liệu sử dụng một chỉ mục để truy cập các hoạt động KHÔNG ĐẦY ĐỦ, và đó là sử dụng một toán hạng chỉ có thể đúng khi cột chứa một giá trị. Ví dụ, một cái gì đó như thế này cho các cột chuỗi (tôi đang giả định một cái gì đó được gọi là CAMPO47 chỉ là một chuỗi):
AND campo47 >= chr(0)
Điều đó sẽ khớp với bất kỳ cột nào có chứa một hoặc nhiều ký tự ascii. Không chắc liệu nó có dẫn đến tối ưu hóa "hai chỉ mục" như bạn mô tả hay không nhưng nó đáng để thử. (Tôi sẽ tự kiểm tra điều này nhưng tôi không có quyền truy cập vào cơ sở dữ liệu Oracle ngay bây giờ và SQL Fiddle đã gặp trở ngại khi tôi cố gắng xem xét Kế hoạch Giải thích)