TSQL เหตุใดจึงมีอันดับสูงสุดเร็วขึ้นด้วยตัวแปร


10

ทุกเช้า

ฉันทำงานกับ sql ที่ซับซ้อนพอสมควรเพื่อ 'รับ' ข้อมูลบางอย่างจากฐานข้อมูลผลิตภัณฑ์ของบุคคลที่สามเพื่อแสดงในแอปพลิเคชันของเราเอง

ฉันเพิ่มในรายการที่เลือกเพื่อรับระเบียนสูงสุดจากตารางภายในแบบสอบถามย่อย (ถ้ามีเหตุผล)

แบบสอบถามใช้เวลาเกือบ 3 นาทีในการส่งคืนชุดผลลัพธ์สุดท้าย 100 รายการโดยใช้

SELECT TOP 1 ...

ฉันดูออนไลน์เพื่อดูการปรับปรุงสิ่งที่ฉันพยายามบรรลุและขอแนะนำให้ฉันเปลี่ยนการเลือกของฉันเพื่อใช้ตัวแปรดังต่อไปนี้

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

นี่ใช้แบบสอบถามเดียวกันจาก 3 นาทีถึง 1 วินาทีซึ่งยอดเยี่ยมมาก!

แต่ทุกคนสามารถอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น

คำตอบ:


14

เมื่อคุณtop 1ใช้เครื่องมือเพิ่มประสิทธิภาพคิวรีจะสร้างแผนที่สร้างขึ้นเพื่อดึงข้อมูล 1 แถวเร็วที่สุด

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

ในกรณีของคุณแผนคิวรีที่สร้างโดยมีเป้าหมายเป็น 100 เป็นแผนที่ดีกว่าที่จะใช้แม้ว่าคุณต้องการเพียงหนึ่งแถว

ในการตรวจสอบคุณสามารถลองเพิ่มoption (recompile)คำค้นหาของคุณด้วยตัวแปร ในกรณีนั้น SQL Server จะใช้ค่าปัจจุบัน@topCountเป็นเป้าหมายแถวและเนื่องจากเป็น 1 คุณควรได้รับแผนช้า


ฉันเข้าใจความแตกต่างในแผน แต่มันทำให้ฉันประหลาดใจว่าการดึงข้อมูล 1 แถวอาจช้ากว่าการเรียก 100 แถว ฉันจะคิดว่าถ้าแผน 100 แถวทำงานได้ดีที่สุด, SQL Server top 1จะใช้แผนเดียวกันสำหรับ
Brandon

@Brandon มันไม่สามารถดึงข้อมูลได้ 100 แถวเพียงสร้างแผนการดำเนินการโดยมีสมมติฐานว่า 100 แถวเป็นสิ่งที่ต้องการ การดำเนินการจะสิ้นสุดลงเมื่อพบ 1 แถว
Mikael Eriksson

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