การใช้ IF ใน T-SQL จะทำให้แผนการดำเนินการแคชอ่อนลงหรือไม่


20

มีการแนะนำให้ฉันว่าการใช้คำสั่ง IF ใน t-SQL batches นั้นเป็นอันตรายต่อประสิทธิภาพ ฉันพยายามค้นหาคำยืนยันหรือตรวจสอบยืนยันนี้ ฉันใช้ SQL Server 2005 และ 2008

การยืนยันคือชุดที่มีดังต่อไปนี้: -

IF @parameter = 0
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

SQL Server ไม่สามารถใช้แผนการดำเนินการที่สร้างขึ้นใหม่ได้เนื่องจากการดำเนินการครั้งต่อไปอาจต้องใช้สาขาอื่น นี่หมายความว่า SQL Server จะกำจัดหนึ่งสาขาทั้งหมดจากแผนการดำเนินการตามพื้นฐานของการดำเนินการปัจจุบันซึ่งสามารถกำหนดสาขาที่ต้องการได้แล้ว นี่เป็นเรื่องจริงหรือ

นอกจากนี้จะเกิดอะไรขึ้นในกรณีนี้: -

IF EXISTS (SELECT ....)
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

ไม่สามารถระบุได้ล่วงหน้าว่าสาขาใดจะถูกดำเนินการ



1
SQL Server สามารถและนำแผนการดำเนินการกลับมาใช้ใหม่เนื่องจากไม่ได้พิจารณาถึงสาขาเฉพาะข้อความที่มีอยู่ในสาขา
MartinC

คำตอบ:


10

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

ฉันจะวาง SQL สำหรับแต่ละสาขาลงในขั้นตอนการจัดเก็บของตัวเองเพื่อให้แผนสร้างขึ้นอยู่กับการใช้งานจริงของพารามิเตอร์สำหรับสาขานั้น


6

ทางลัดเดียวจะเป็น IF 1 = 1

ทั้งพารามิเตอร์ @ และ EXISTS ยังต้องการการประมวลผลสำหรับ "กรณีทั่วไป" ( @parameter = 42พูด)

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


3

พยายามแสดงแผนการดำเนินการโดยประมาณไม่ใช่ของจริง คุณจะเห็นว่าคนแรกมีCONDผู้ประกอบการ

ตัวดำเนินการนี้รวมอยู่ในแผนการดำเนินการแคชด้วย ในตัวอย่างของคุณแผนแก้ปัญหาโดยประมาณจะมีตัวดำเนินการ COND หนึ่งตัวและสาขาที่เลือก 2 สาขาดังนั้นจึงจะสามารถนำมาใช้ใหม่ได้อย่างสมบูรณ์ เพราะเมื่อดำเนินการ SQL Server แบบแบตช์ประเมินงบ DML ไม่เพียง แต่ทั้งหมดอื่น ๆ เช่นกันรับจากแผน

แผนการดำเนินการภายในเป็นโครงสร้างที่คล้ายกับทรีนิพจน์


0

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

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

คุณสามารถดูได้ว่าโดยการสลับไปที่แสดงแผนการดำเนินการเรียกใช้สคริปต์ - สังเกตเห็นความแตกต่างในแผน เมื่อคุณเรียกใช้โพรซีเดอร์ (ฉันกำลังสมมติว่าโพรซีเดอร์ที่เก็บไว้ที่นี่) คุณจะสังเกตเห็นว่าครั้งแรกโดยทั่วไปจะเร็วกว่าส่วนที่สองจะใช้แผนที่เก็บไว้ เปลี่ยนพารามิเตอร์และทำซ้ำจากนั้นเรียกใช้พารามิเตอร์ดั้งเดิม - ในทางทฤษฎีแผนจะยังคงอยู่ในแคช แต่ขึ้นอยู่กับการใช้งานเซิร์ฟเวอร์ (เห็บแคช - พวกเขาไม่อยู่ตลอดไป .. ) เป็นต้น


0

อาจได้รับการปรับปรุงในปี 2005 และ 2008 แต่การใช้เงื่อนไขในปี 2000 น่าจะแย่กว่าที่คุณอธิบายมันจะรวบรวมแผนเพื่อจัดการขั้นตอนแรกของกระบวนการให้ดีที่สุดจากนั้นใช้แผนนั้นเพื่อดำเนินการตามขั้นตอนแม้ว่าเงื่อนไข การเปลี่ยนแปลง จากประสบการณ์ของฉันสิ่งนี้ทำให้แบบสอบถามที่วิ่งในไม่กี่นาทีทำงานในชั่วโมง แม้ว่าฉันจะใช้ 2008 ตอนนี้และใช้ 2005 ฉันไม่สามารถให้ความเห็นเกี่ยวกับวิธีการทำงานของ coditionals ที่นั่นได้เนื่องจากฉันไม่ได้ใช้พวกเขาอีกต่อไป


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