Outer Apply vs Left Join Performance


37

ฉันใช้ SQL Server 2008 R2

ฉันเพิ่งเจอ APPLY ใน SQL และชอบที่จะแก้ปัญหาการสืบค้นสำหรับหลาย ๆ กรณี

ตารางจำนวนมากที่ฉันใช้ 2 left join เพื่อให้ได้ผลลัพธ์ฉันสามารถสมัครนอก 1 ครั้งได้

ฉันมีข้อมูลจำนวนเล็กน้อยในตารางฐานข้อมูลท้องถิ่นของฉันและหลังจากการปรับใช้รหัสควรทำงานบนข้อมูลอย่างน้อย 20 ครั้งใหญ่

ฉันกังวลว่าการใช้งานภายนอกอาจใช้เวลานานกว่าเงื่อนไขการเข้าร่วม 2 ด้านซ้ายสำหรับข้อมูลจำนวนมาก

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

นี่คือแบบสอบถามที่มี 2 ซ้ายเข้าร่วม

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

นี่คือแบบสอบถามที่มีการใช้งานภายนอก

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 

คำตอบ:


44

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

APPLYเป็นการรวมที่สัมพันธ์กัน (เรียกว่า a LATERAL JOINในบางผลิตภัณฑ์และ SQL Standard เวอร์ชันใหม่กว่า) เช่นเดียวกับโครงสร้างแบบลอจิคัลใด ๆ ไม่มีผลกระทบโดยตรงต่อประสิทธิภาพ โดยหลักการแล้วเราควรจะสามารถเขียนแบบสอบถามโดยใช้ไวยากรณ์ที่เทียบเท่าเชิงตรรกะใด ๆ และเครื่องมือเพิ่มประสิทธิภาพจะแปลงข้อมูลของเราให้เป็นแผนปฏิบัติการทางกายภาพเดียวกัน

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

รูปแบบที่เฉพาะเจาะจงของOUTER APPLY ( SELECT TOP ... )มีแนวโน้มที่จะส่งผลให้ความสัมพันธ์ลูปซ้อนกันเข้าร่วมในรุ่นปัจจุบันของ SQL Server JOINเพราะเพิ่มประสิทธิภาพไม่ได้มีตรรกะที่จะเปลี่ยนรูปแบบนี้จะเทียบเท่า การรวมลูปซ้อนกันที่สัมพันธ์กันอาจทำงานได้ไม่ดีถ้าอินพุตด้านนอกมีขนาดใหญ่และอินพุตภายในไม่ได้จัดทำดัชนีหรือหน้าที่ต้องการยังไม่ได้อยู่ในหน่วยความจำ นอกจากนี้องค์ประกอบเฉพาะของรูปแบบต้นทุนของเครื่องมือเพิ่มประสิทธิภาพหมายถึงการเข้าร่วมลูปซ้อนที่สัมพันธ์กันนั้นมีโอกาสน้อยกว่าการใช้ความหมายเหมือนกันJOINในการสร้างแผนการดำเนินการแบบคู่ขนาน

ฉันสามารถทำแบบสอบถามเดียวกันด้วยการเข้าร่วมซ้ายและเดี่ยว row_number ()

นี่อาจเป็นหรือไม่ดีกว่าในกรณีทั่วไป คุณจะต้องทดสอบประสิทธิภาพทั้งทางเลือกด้วยข้อมูลตัวแทน LEFT JOINและROW_NUMBERแน่นอนมีศักยภาพที่จะมีประสิทธิภาพมากขึ้น แต่มันขึ้นอยู่กับรูปร่างแผนแบบสอบถามที่แม่นยำได้รับการแต่งตั้ง ปัจจัยหลักที่ส่งผลต่อประสิทธิภาพของวิธีการนี้คือความพร้อมใช้งานของดัชนีเพื่อครอบคลุมคอลัมน์ที่จำเป็นและเพื่อจัดหาคำสั่งที่จำเป็นโดยPARTITION BYและORDER BYข้อ ปัจจัยที่สองคือขนาดของตาราง ประสิทธิภาพและการจัดทำดัชนีที่ดีAPPLYสามารถทำได้ROW_NUMBERด้วยการจัดทำดัชนีที่ดีที่สุดหากแบบสอบถามสัมผัสส่วนที่ค่อนข้างเล็กของตารางที่เกี่ยวข้อง จำเป็นต้องทำการทดสอบ


2

แบบสอบถามแรกอาจทำงานแบบขนานโดยคำขอเดียวเท่านั้นไปยังเซิร์ฟเวอร์ sql มันดึงระเบียนทั้งหมดและให้ผลลัพธ์ตามเกณฑ์ตัวกรอง

แต่ในกรณีที่สองมันทำงานทีละแถวและสำหรับแต่ละแถว Table2 จะถูกสแกนและผนวกเข้ากับผลลัพธ์

หากข้อความค้นหาภายนอกของคุณมีบันทึกน้อยกว่าอันดับที่สองจะดีกว่า (นอกนำไปใช้) แต่ถ้าแบบสอบถามแรกอาจได้รับข้อมูลเพิ่มเติมคุณควรใช้แบบสอบถามแรก

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