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:
Berikut ini adalah logika yang sama ketika dijalankan sebagai bagian dari kueri lengkap:
Warna sesuai dengan tabel yang sama di kedua tangkapan layar. Untuk permintaan lambat, Oracle melakukan MERGE JOIN
antara 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 ALL
dalam 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 UNPIVOT
ke 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.
sumber
Jawaban:
Coba petunjuk pengoptimal Oracle berikut:
Petunjuk ini menonaktifkan ekspansi-OR. Ekspansi OR mengubah gabungan kondisi-OR atau IN-list dalam
where
klausa menjadi kueri gabungan denganunion 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:
tetapi petunjuk ini menonaktifkan semua transformasi kueri yang dapat dilakukan pengoptimal selain transformasi yang selalu dapat diterapkan oleh pengoptimal .
sumber