ผมใช้ Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) ใน 4 vCPU VM กับmax degree of parallelism
ชุด2
และชุดcost threshold for parallelism
50
ในตอนเช้าเมื่อพยายามแสดงแผนการดำเนินการโดยประมาณสำหรับคิวรีแบบเลือก TOP 100ฉันพบว่าต้องรอเป็นจำนวนมากและการดำเนินการเพื่อแสดงแผนโดยประมาณใช้เวลาไม่กี่นาทีบ่อยครั้งในช่วง 5 - 7 นาที อีกครั้งนี้ไม่ได้ปฏิบัติจริงของแบบสอบถามนี้เป็นเพียงกระบวนการเพื่อแสดงแผนการดำเนินการโดยประมาณ
sp_WhoIsActive
จะแสดงPAGEIOLATCH_SH
รอหรือLATCH_EX [ACCESS_METHODS_DATASET_PARENT]
รอและเมื่อฉันเรียกใช้สคริปต์WaitingTasks.sql ของ Paul Randalในระหว่างการดำเนินการก็จะแสดงการCXPACKET
รอด้วยเธรดผู้ทำงานที่แสดงการPAGEIOLATCH_SH
รอ:
* ฟิลด์คำอธิบายทรัพยากร = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
เธรดผู้ปฏิบัติงานดูเหมือนจะนำstats
ตารางทั้งหมดมาไว้ในหน่วยความจำ (เช่นหมายเลขหน้าเหล่านั้นรวมถึงหมายเลขหน้าถัดไปที่แสดงจากแบบสอบถามของ Paul Randal กลับไปยังคีย์คลัสเตอร์สำหรับstats
ตาราง) เมื่อแผนกลับมามันเป็นช่วงเวลาที่เหลือของวันทันทีหลังจากที่ฉันเห็นการstats
ขัดสีส่วนใหญ่ของตารางจากแคชที่มีเพียงระเบียนต่าง ๆ ที่เหลืออยู่เท่านั้น (ที่ฉันคิดว่าถูกดึงเนื่องจากการค้นหาจากการค้นหาที่คล้ายกัน)
ฉันคาดหวังว่าพฤติกรรมเริ่มต้นนี้หากแบบสอบถามกำลังดำเนินการตามแผนที่ใช้ตัวดำเนินการ SCAN แต่ทำไมมันถึงทำเช่นนี้เมื่อประเมินแผนการดำเนินการเท่านั้นที่จะมาถึงผู้ดำเนินการ SEEK ดังที่แสดงในแผนเชื่อมโยงด้านบน ฉันจะทำอย่างไร (นอกเหนือจากการเรียกใช้คำสั่งนี้ก่อนเวลาทำการเพื่อให้ข้อมูลของฉันถูกแคชอย่างเหมาะสม) เพื่อช่วยปรับปรุงประสิทธิภาพที่นี่ ฉันสมมติว่าคู่ของดัชนีครอบคลุมจะเป็นประโยชน์ แต่พวกเขาจะรับประกันการเปลี่ยนแปลงพฤติกรรมจริง ๆ หรือไม่ ฉันต้องทำงานภายในข้อ จำกัด ของหน้าต่างการจัดเก็บและการบำรุงรักษาที่นี่และแบบสอบถามเองสร้างขึ้นจากโซลูชันของผู้ขายดังนั้นข้อเสนอแนะอื่น ๆ (นอกเหนือจากการจัดทำดัชนีที่ดีกว่า) จะได้รับการต้อนรับในจุดนี้