ฉันจะป้องกัน UNPIVOT ไม่ให้ถูกแปลงเป็น UNION ALL ได้อย่างไร


13

ฉันมีแบบสอบถามของ Oracle ที่ค่อนข้างซับซ้อนซึ่งใช้เวลาประมาณครึ่งชั่วโมง ถ้าฉันใช้ส่วนที่ช้าของแบบสอบถามและเรียกใช้แยกต่างหากมันจะเสร็จสิ้นในไม่กี่วินาที นี่คือภาพหน้าจอของรายงานการตรวจสอบ SQL สำหรับข้อความค้นหาแยก:

แผนโอเค

นี่คือตรรกะเดียวกันเมื่อเรียกใช้เป็นส่วนหนึ่งของแบบสอบถามแบบเต็ม:

แผนไม่ดี

สีตรงกับตารางเดียวกันในภาพหน้าจอทั้งสอง สำหรับคำช้า, Oracle จะทำระหว่างสองตารางที่ไม่ได้มีสภาพความเท่าเทียมกันในMERGE JOIN JOINด้วยเหตุนี้จึงมีการประมวลผลแถวกลางประมาณ 150 ล้านแถว

ฉันสามารถแก้ไขปัญหานี้ด้วยคำแนะนำการสืบค้นหรือการเขียนใหม่ แต่ฉันต้องการเข้าใจสาเหตุของปัญหาได้มากเท่าที่จะทำได้เพื่อที่ฉันจะได้สามารถหลีกเลี่ยงปัญหานี้ได้ในอนาคตและอาจส่งรายงานข้อผิดพลาดไปยัง Oracle ทุกครั้งที่ฉันได้รับแผนไม่ดีUNPIVOTในข้อความแบบสอบถามจะถูกแปลงเป็นUNION ALLในแผน หากต้องการตรวจสอบเพิ่มเติมฉันต้องการป้องกันไม่ให้เกิดการเปลี่ยนแปลงการค้นหา ฉันไม่สามารถหาชื่อสำหรับการเปลี่ยนแปลงนี้ได้ ฉันยังไม่สามารถค้นหาคำใบ้หรือพารามิเตอร์ขีดล่างที่จะป้องกันได้ ฉันกำลังทดสอบเซิร์ฟเวอร์การพัฒนาเพื่อให้มีอะไรเกิดขึ้น

มีอะไรที่ฉันสามารถทำได้เพื่อป้องกันการเปลี่ยนแปลงแบบสอบถามของUNPIVOTการUNION ALL? ฉันใช้ Oracle 12.1.0.2

ฉันไม่สามารถแชร์คิวรีชื่อตารางหรือข้อมูลด้วยเหตุผล IP ฉันไม่สามารถคิดแบบง่าย ๆ ได้ จากที่กล่าวมามันไม่ชัดเจนสำหรับฉันว่าทำไมข้อมูลนั้นจำเป็นต้องใช้ในการตอบคำถาม นี่คือตัวอย่างของแบบสอบถาม UNPIVOT พร้อมกับแบบสอบถามเดียวกันที่ใช้กับ UNION ALL


1
ในตัวอย่างของคุณมีอยู่ทั้งหมดดังนั้นมันจะแสดง ฉันเรียกใช้แบบสอบถามของตัวเองที่ไม่มีสหภาพทั้งหมดและอธิบายแผนไม่แสดงสหภาพทั้งหมด ดังนั้นอาจเป็นข้อความค้นหาของคุณไม่ใช่การดำเนินการ unpivot ที่ทำให้เกิดปัญหาที่นี่
ราชา

@Raj จุดคือปิดการใช้งานการแปลงนั้นโดยไม่ต้องเปลี่ยนข้อความค้นหาเพื่อ จำกัด ปัญหาให้แคบลง
โจ Obbish

3
ฉันทำงานกับ Oracle มาหลายปีแล้ว แต่บางครั้งฉันต้องการเห็นแบบสอบถามหรือแบบสอบถามหลอกที่ใช้ร่วมกันได้อย่างน้อยที่สุดกับคอลัมน์ / ตารางของคุณที่ถูกแทนที่ โดยที่ฉันสามารถคาดเดาได้ แต่ก็ไม่มีประโยชน์สำหรับคุณและฉัน
ราชา

คำตอบ:


1

ลองใช้คำใบ้ของเครื่องมือเพิ่มประสิทธิภาพ Oracle ต่อไปนี้:

NO_EXPAND

คำใบ้นี้จะปิดการใช้งานหรือการขยายตัว หรือขยายตัวแปลงรวมกันหรือเงื่อนไขหรือในรายการในข้อเป็นแบบสอบถามผสมกับwhereunion all

เราไม่มี SQL ของคุณดังนั้นนี่เป็นการคาดเดา แต่ดูเหมือนจะเป็นตัวเลือกที่เหมาะสม

เป็นตัวเลือกที่สองเนื่องจากคุณอยู่ในสภาพแวดล้อมการพัฒนาคุณสามารถลองใช้คำใบ้ของออพติไมเซอร์ออพติไมซ์:

NO_QUERY_TRANSFORMATION

แต่คำแนะนำนี้ปิดการใช้งานทุกแปลงแบบสอบถามที่เพิ่มประสิทธิภาพสามารถดำเนินการอื่นที่ไม่ใช่การเปลี่ยนแปลงที่เพิ่มประสิทธิภาพเสมอสามารถนำไปใช้


หรือไม่ใช่สิ่งเดียวกันกับ UNPIVOT คุณสามารถสร้างตัวอย่างง่ายๆที่แสดงคำใบ้ NO_EXPAND ที่ทำงานกับ UNPIVOT ได้หรือไม่ ฉันได้ลองแล้วและมันก็ไม่ได้ผลสำหรับฉัน
โจ Obbish

@JoeObbish - คุณสามารถจัดเตรียม UNPiVOT SQL ที่ซับซ้อนในแบบลดขนาดได้หรือไม่ ฉันต้องการช่วยคุณถ้าฉันสามารถ ...
tale852150

1
@JoeObbish - อัปเดตคำตอบพร้อมคำแนะนำอื่น หวังว่านี่จะช่วยได้
tale852150
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.