Làm cách nào tôi có thể ngăn UNPIVOT biến thành UNION ALL?


13

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:

kế hoạch ok

Đây là logic tương tự khi chạy như một phần của truy vấn đầy đủ:

kế hoạch xấu

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 JOINgiữ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, UNPIVOTtrong văn bản truy vấn sẽ được chuyển thành một UNION ALLtrong 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 UNPIVOTthà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.


1
Trong ví dụ của bạn, tất cả tồn tại do đó nó cho thấy. Tôi đã chạy truy vấn của riêng mình mà không có liên minh tất cả và giải thích kế hoạch không hiển thị tất cả liên minh. Vì vậy, có lẽ đó là truy vấn của bạn và không phải là hoạt động unpOLL đang gây ra vấn đề ở đây?
Raj

@Raj Vấn đề là vô hiệu hóa chuyển đổi đó mà không thay đổi văn bản truy vấn để tiếp tục thu hẹp vấn đề.
Joe Obbish

3
Tôi đã làm việc với Oracle trong nhiều năm, nhưng đôi khi tôi cần phải xem truy vấn giả hoặc truy vấn giả tương thích ít nhất với các cột / bảng của bạn được thay thế. không có điều đó tôi có thể tiếp tục đoán nhưng nó không hữu ích cho bạn cũng như cho tôi.
Raj

Câu trả lời:


1

Hãy thử gợi ý tối ưu hóa Oracle sau đây:

NO_EXPAND

Gợi ý này vô hiệu hóa mở rộng OR. Mở rộng OR biến đổi các điều kiện OR kết hợp hoặc danh sách IN trong wheremệnh đề thành truy vấn kết hợp với union all.

Chúng tôi không có SQL của bạn nên đây là một phỏng đoán nhưng dường như là một lựa chọn khả thi.

Là một lựa chọn thứ hai, vì bạn đang ở trong môi trường phát triển, bạn có thể thử gợi ý tối ưu hóa Oracle:

NO_QUERY_TRANSFORMATION

nhưng gợi ý này sẽ vô hiệu hóa tất cả các biến đổi truy vấn mà trình tối ưu hóa có thể thực hiện ngoài các biến đổi mà trình tối ưu hóa luôn có thể áp dụng.


HOẶC không giống với UNPIVOT. Bạn có thể tạo một ví dụ đơn giản cho thấy gợi ý NO_EXPAND hoạt động cho UNPIVOT không? Tôi đã thử điều này và nó không làm việc cho tôi.
Joe Obbish

@JoeObbish - Bạn có thể cung cấp phiên bản thu nhỏ của SQL phức tạp của mình với UNPiVOT không? Tôi muốn giúp bạn nếu tôi có thể ...
tale852150

1
@JoeObbish - cập nhật câu trả lời với một đề nghị khác. Hi vọng điêu nay co ich.
tale852150
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.