ทำไมการดำเนินการ TOP ในแผนการดำเนินการ SQL


9

หลังจากค้นหาไปสักพักหนึ่งฉันตัดสินใจที่จะโพสต์คำถามนี้เพื่อหาคำตอบและขออภัยหากมีคำถาม / คำตอบที่คล้ายกัน

เมื่อเรียกใช้คิวรีด้านล่างของเซิร์ฟเวอร์ SQL สองตัวที่คล้ายกันเราพบแผนการดำเนินการที่แตกต่างกันซึ่งมีผลต่อประสิทธิภาพและเราต้องการความช่วยเหลือในการหาสาเหตุ

แบบสอบถาม:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

แผนการดำเนินการของเซิร์ฟเวอร์ A เซิร์ฟเวอร์ B

แผนการดำเนินการของเซิร์ฟเวอร์ B เซิร์ฟเวอร์ B http://s2.postimg.org/z9fjrfv4n/server_B.png

คุณจะสังเกตเห็นว่าเซิร์ฟเวอร์ B มีการดำเนินการทางกายภาพสูงสุดในแผนการดำเนินการจริงและเรากำลังพยายามหาสาเหตุ แบบสอบถามทั้งสองใช้ดัชนีเดียวกันในดัชนีค้นหา

นี่คือรายละเอียดบางอย่างของเซิร์ฟเวอร์ A และเซิร์ฟเวอร์ B

เซิร์ฟเวอร์ A และ B เป็นทั้งคู่

Windows Server 2008 R2 Standard Service Pack 1

RAM 24GB

ระบบปฏิบัติการ 64 บิต

SQL Server 2012รุ่นที่ได้รับจากการใช้ ( เลือก SERVERPROPERTY ('ProductVersion') )

เซิร์ฟเวอร์A SQL เวอร์ชัน11.0.3000.0

เซิร์ฟเวอร์B SQL เวอร์ชัน11.0.5058.0

สิ่งที่เราได้ลอง

  1. ขั้นตอนการล้างแคช
  2. กำลังสร้างดัชนีใหม่
  3. รีเฟรชสถิติ
  4. ชุด ROWCOUNT 0 กับ rowcount และไป

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


TOPประกอบการแสดงให้เห็นไม่ใช่ศูนย์SET ROWCOUNTได้ดำเนินการก่อนหน้านี้ในการเชื่อมต่อที่ ลองอีกครั้งหลังจากดำเนินการSET ROWCOUNT 0;แล้ว นอกจากนี้เวอร์ชัน SQL ที่คุณโพสต์ไม่ใช่ SQL 2008 R2 รันSELECT SERVERPROPERTY('ProductVersion');บนเซิร์ฟเวอร์ 2 เครื่องเพื่อรับรุ่นเซิร์ฟเวอร์ SQL ที่แท้จริง
Dan Guzman

ฉันอัปเดตโพสต์ต้นฉบับด้วยเวอร์ชัน sql โดยใช้คิวรีแบบเลือกที่มีให้ เซิร์ฟเวอร์ที่ติดตั้ง sql เป็นเซิร์ฟเวอร์ windows 2008 R2 ในขณะที่ติดตั้งเซิร์ฟเวอร์ sql คือ 2012 ตามที่แนะนำไว้ก่อนหน้านี้โดยสมาชิกคนอื่นที่ถูกลบไปแล้วเราพยายามตั้งค่า ROWCOUNT เป็น 0 โดยไม่มีการเปลี่ยนแปลงแผนการดำเนินการ ดูคำถามล่าสุด
Arthur Yegiazaryan

คุณสามารถใส่GOบรรทัดหลัง rowcount ได้ไหม คุณสามารถโพสต์คุณสมบัติของผู้ให้บริการยอดนิยมได้หรือไม่
Rob Farley

Rob เพิ่ม GO และคุณสมบัติจาก TOP ไปยังโพสต์ต้นฉบับ
Arthur Yegiazaryan

คำตอบ:


12

ตรวจสอบเพื่อให้แน่ใจว่าระดับความเข้ากันได้ของฐานข้อมูลเหมือนกันบนเซิร์ฟเวอร์ 2 เครื่อง ฉันรันการทดสอบอย่างรวดเร็วของอินสแตนซ์ของ SQL Server 2012 และดูตัวดำเนินการ TOP ที่แนะนำถ้าระดับความเข้ากันได้คือ 100 หรือต่ำกว่า นอกจากว่าคุณมีเหตุผลที่เฉพาะเจาะจงที่จะทำเช่นนั้นจะเป็นการดีที่สุดที่จะใช้ระดับความเข้ากันได้ของ 110 (SQL Server 2012) ในอินสแตนซ์ของ SQL Server 2012


2

ฉันคิดว่าคุณมีค่าสำหรับ ROWCOUNT ทำ:

SET ROWCOUNT 0

... เพื่อปิด


1
SET ROWCOUNT 0 ไม่ได้ลบ TOP ออกจากแผนปฏิบัติการ
Arthur Yegiazaryan

1
@Athth แม้ว่าจะไม่ใช่วิธีแก้ปัญหาในกรณีของคุณแต่อาจเป็นสาเหตุของพฤติกรรมสำหรับผู้อ่านในอนาคต (ขออภัย Rob ฉันเอาเสรีภาพในการยกเลิกการลบโพสต์ของคุณเพราะนี่อาจเป็นปัญหาสำหรับอาการเดียวกัน)
Aaron Bertrand

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