ฉันมีแบบสอบถามของ Oracle ที่ค่อนข้างซับซ้อนซึ่งใช้เวลาประมาณครึ่งชั่วโมง ถ้าฉันใช้ส่วนที่ช้าของแบบสอบถามและเรียกใช้แยกต่างหากมันจะเสร็จสิ้นในไม่กี่วินาที นี่คือภาพหน้าจอของรายงานการตรวจสอบ SQL สำหรับข้อความค้นหาแยก:
นี่คือตรรกะเดียวกันเมื่อเรียกใช้เป็นส่วนหนึ่งของแบบสอบถามแบบเต็ม:
สีตรงกับตารางเดียวกันในภาพหน้าจอทั้งสอง สำหรับคำช้า, Oracle จะทำระหว่างสองตารางที่ไม่ได้มีสภาพความเท่าเทียมกันในMERGE JOIN
JOIN
ด้วยเหตุนี้จึงมีการประมวลผลแถวกลางประมาณ 150 ล้านแถว
ฉันสามารถแก้ไขปัญหานี้ด้วยคำแนะนำการสืบค้นหรือการเขียนใหม่ แต่ฉันต้องการเข้าใจสาเหตุของปัญหาได้มากเท่าที่จะทำได้เพื่อที่ฉันจะได้สามารถหลีกเลี่ยงปัญหานี้ได้ในอนาคตและอาจส่งรายงานข้อผิดพลาดไปยัง Oracle ทุกครั้งที่ฉันได้รับแผนไม่ดีUNPIVOT
ในข้อความแบบสอบถามจะถูกแปลงเป็นUNION ALL
ในแผน หากต้องการตรวจสอบเพิ่มเติมฉันต้องการป้องกันไม่ให้เกิดการเปลี่ยนแปลงการค้นหา ฉันไม่สามารถหาชื่อสำหรับการเปลี่ยนแปลงนี้ได้ ฉันยังไม่สามารถค้นหาคำใบ้หรือพารามิเตอร์ขีดล่างที่จะป้องกันได้ ฉันกำลังทดสอบเซิร์ฟเวอร์การพัฒนาเพื่อให้มีอะไรเกิดขึ้น
มีอะไรที่ฉันสามารถทำได้เพื่อป้องกันการเปลี่ยนแปลงแบบสอบถามของUNPIVOT
การUNION ALL
? ฉันใช้ Oracle 12.1.0.2
ฉันไม่สามารถแชร์คิวรีชื่อตารางหรือข้อมูลด้วยเหตุผล IP ฉันไม่สามารถคิดแบบง่าย ๆ ได้ จากที่กล่าวมามันไม่ชัดเจนสำหรับฉันว่าทำไมข้อมูลนั้นจำเป็นต้องใช้ในการตอบคำถาม นี่คือตัวอย่างของแบบสอบถาม UNPIVOT พร้อมกับแบบสอบถามเดียวกันที่ใช้กับ UNION ALL