Bagaimana saya bisa mencegah UNPIVOT dari diubah menjadi UNION ALL?

13

Saya memiliki permintaan Oracle yang agak rumit yang membutuhkan waktu setengah jam untuk menyelesaikannya. Jika saya mengambil bagian lambat dari kueri dan menjalankannya secara terpisah selesai dalam beberapa detik. Berikut ini adalah tangkapan layar laporan SQL Monitor untuk kueri yang terisolasi:

rencana ok

Berikut ini adalah logika yang sama ketika dijalankan sebagai bagian dari kueri lengkap:

rencana yang buruk

Warna sesuai dengan tabel yang sama di kedua tangkapan layar. Untuk permintaan lambat, Oracle melakukan MERGE JOINantara dua tabel yang tidak memiliki kondisi kesetaraan di JOIN. Sebagai akibatnya, sekitar 150 juta baris perantara tidak perlu diproses.

Saya dapat mengatasi masalah ini dengan petunjuk atau penulisan ulang kueri, tetapi saya ingin memahami sebanyak mungkin akar penyebabnya sehingga saya dapat menghindari masalah ini di masa mendatang dan mungkin mengirimkan laporan bug ke Oracle. Setiap kali saya mendapatkan paket yang buruk UNPIVOT, teks dalam kueri ditransformasikan menjadi UNION ALLdalam paket. Untuk menyelidiki lebih lanjut, saya ingin mencegah transformasi permintaan tersebut terjadi. Saya tidak dapat menemukan nama untuk transformasi ini. Saya juga belum dapat menemukan petunjuk kueri atau garis bawah parameter yang akan mencegahnya. Saya menguji pada server pengembangan sehingga semuanya berjalan.

Apakah ada yang bisa saya lakukan untuk mencegah transformasi permintaan UNPIVOTke UNION ALL? Saya menggunakan Oracle 12.1.0.2.

Saya tidak dapat membagikan kueri, nama tabel, atau data karena alasan IP. Saya tidak dapat menghasilkan reproduksi sederhana. Dengan itu, tidak jelas bagi saya mengapa informasi itu diperlukan untuk menjawab pertanyaan. Berikut adalah contoh kueri UNPIVOT bersama dengan kueri yang sama yang diterapkan sebagai UNION ALL.

Joe Obbish
sumber
1
Dalam contoh Anda, semua yang ada karenanya ditampilkan. Saya menjalankan kueri saya sendiri yang tidak memiliki gabungan semua dan menjelaskan rencana tidak menunjukkan gabungan semua. Jadi, mungkin itu pertanyaan Anda dan bukan operasi tidak berpasangan yang menyebabkan masalah di sini?
Raj
@Raj Intinya adalah untuk menonaktifkan transformasi itu tanpa mengubah teks kueri untuk mempersempit masalah.
Joe Obbish
3
Saya telah bekerja dengan Oracle selama bertahun-tahun, tetapi kadang-kadang saya perlu melihat kueri atau kueri semu yang paling kompatibel dengan kolom / tabel yang diganti. tanpanya aku bisa terus menebak tetapi itu tidak berguna bagimu atau bagiku.
Raj

Jawaban:

1

Coba petunjuk pengoptimal Oracle berikut:

NO_EXPAND

Petunjuk ini menonaktifkan ekspansi-OR. Ekspansi OR mengubah gabungan kondisi-OR atau IN-list dalam whereklausa menjadi kueri gabungan dengan union all.

Kami tidak memiliki SQL Anda jadi ini dugaan tetapi tampaknya opsi yang layak.

Sebagai pilihan kedua, karena Anda berada dalam lingkungan pengembangan, Anda dapat mencoba petunjuk pengoptimal Oracle:

NO_QUERY_TRANSFORMATION

tetapi petunjuk ini menonaktifkan semua transformasi kueri yang dapat dilakukan pengoptimal selain transformasi yang selalu dapat diterapkan oleh pengoptimal .

tale852150
sumber
ATAU bukan hal yang sama dengan UNPIVOT. Bisakah Anda menghasilkan contoh sederhana yang memperlihatkan petunjuk NO_EXPAND yang berfungsi untuk UNPIVOT? Saya sudah mencoba ini dan itu tidak berhasil untuk saya.
Joe Obbish
@ Jooehbbish - Tolong, bisakah Anda memberikan versi SQL kompleks yang diperkecil dengan UNPiVOT? Saya ingin membantu Anda jika saya bisa ...
tale852150
1
@ Jooebbish - jawaban yang diperbarui dengan saran lain. Semoga ini membantu.
tale852150