Tôi có một truy vấn Oracle hơi phức tạp, mất khoảng nửa giờ để hoàn thành. Nếu tôi lấy phần chậm của truy vấn và chạy riêng nó, nó sẽ hoàn thành sau vài giây. Đây là một ảnh chụp màn hình của báo cáo SQL Monitor cho truy vấn bị cô lập:
Đây là logic tương tự khi chạy như một phần của truy vấn đầy đủ:
Các màu tương ứng với cùng một bảng trong cả hai ảnh chụp màn hình. Đối với truy vấn chậm, Oracle đang thực hiện MERGE JOIN
giữa hai bảng không có điều kiện bằng trong JOIN
. Do đó, khoảng 150 triệu hàng trung gian được xử lý không cần thiết.
Tôi có thể giải quyết vấn đề này bằng các gợi ý truy vấn hoặc viết lại, nhưng tôi muốn hiểu càng nhiều nguyên nhân gốc càng tốt để tôi có thể tránh vấn đề này trong tương lai và có thể gửi báo cáo lỗi cho Oracle. Mỗi khi tôi nhận được kế hoạch xấu, UNPIVOT
trong văn bản truy vấn sẽ được chuyển thành một UNION ALL
trong kế hoạch. Để điều tra thêm, tôi muốn ngăn chặn sự chuyển đổi truy vấn đó xảy ra. Tôi đã không thể tìm thấy một tên cho sự chuyển đổi này. Tôi cũng không thể tìm thấy một gợi ý truy vấn hoặc tham số gạch dưới sẽ ngăn chặn nó. Tôi đang thử nghiệm trên một máy chủ phát triển nên mọi thứ đều ổn.
Có bất cứ điều gì tôi có thể làm để ngăn chặn chuyển đổi truy vấn của UNPIVOT
thành UNION ALL
? Tôi đang dùng Oracle 12.1.0.2.
Tôi không thể chia sẻ truy vấn, tên bảng hoặc dữ liệu vì lý do IP. Tôi đã không thể tạo ra một bản sao đơn giản. Như đã nói, tôi không rõ tại sao thông tin đó lại cần thiết để trả lời câu hỏi. Dưới đây là một ví dụ về truy vấn UNPIVOT cùng với truy vấn tương tự được triển khai là UNION ALL.