Vấn đề là bạn đang chỉ định hai điều kiện với OR áp dụng cho các bảng riêng biệt trong truy vấn của bạn. Do đó, tìm kiếm chỉ mục không phân bổ phải trả lại hầu hết hoặc tất cả các hàng trong bảng lớn của bạn vì logic HOẶC có nghĩa là chúng cũng có thể khớp với mệnh đề điều kiện trong bảng thứ hai.
Nhìn vào kế hoạch thực thi SQL trong cả ba ví dụ trên và lưu ý số hàng xuất phát từ chỉ mục không phân tán tìm kiếm từ bảng lớn. Kết quả cuối cùng có thể chỉ trả về 1.000 hoặc ít hơn trong số 800.000 hàng trong bảng nhưng mệnh đề OR có nghĩa là nội dung của bảng đó phải được tham chiếu chéo với điều kiện trong bảng thứ hai vì OR có nghĩa là chúng có thể cần thiết cho cuối cùng đầu ra truy vấn.
Tùy thuộc vào kế hoạch thực hiện của bạn, tìm kiếm chỉ mục có thể kéo ra tất cả 800.000 hàng trong bảng lớn vì chúng cũng có thể phù hợp với các điều kiện của mệnh đề OR trong bảng thứ hai. UNION ALL là hai truy vấn riêng biệt với một bảng, mỗi truy vấn chỉ mục phải xuất ra tập kết quả nhỏ hơn có thể phù hợp với điều kiện cho truy vấn đó.
Tôi hy vọng điều này có ý nghĩa. Tôi đã gặp phải tình huống tương tự khi cấu trúc lại các câu lệnh SQL chạy chậm.
Chúc mừng bạn,
Andre Ranieri