อะไรคือสาเหตุของแผนที่จะหายไปจากแคชสำหรับขั้นตอนการจัดเก็บ?
WITH RECOMPILE
- SQL แบบไดนามิก
- รหัสที่เข้ารหัส
- การเปลี่ยนแปลงข้อมูลที่สำคัญ
- อัปเดตสถิติ
- มีอะไรอีกบ้าง?
ฉันทำงานกับเซิร์ฟเวอร์ 2 เครื่อง (SQL Server 2008 R2 และ SQL Server 2012) เมื่อเร็ว ๆ นี้ที่ไม่มีแผนในแคชสำหรับขั้นตอนการจัดเก็บที่ใช้ทรัพยากรมาก คำสั่งจำนวนมากอาจทั้งหมดในกระบวนการที่เก็บไว้ยังไม่มีแผนในแคช โพรซีเดอร์ที่เก็บไว้บางตัวรันค่อนข้างบ่อยเหมือนสองสามครั้งต่อวินาที
ไม่มีแรงกดดันด้านความจำ แต่อย่างใด เซิร์ฟเวอร์ตัวใดตัวหนึ่งมีฮาร์ดแวร์มากกว่าที่ต้องการ
ฉันคิดว่าแผนที่ขาดหายไปเกิดจากการสร้างตารางชั่วคราวในระหว่างขั้นตอนการจัดเก็บ แต่ดูเหมือนจะเป็นข้อมูลเก่าจาก SQL Server 2000 หรือเก่ากว่า เริ่มต้นด้วย SQL Server 2005 การคอมไพล์ใหม่เกิดขึ้นที่ระดับคำสั่งสำหรับคำสั่งหลังจาก DDL เป็นจริงในทุกกรณีหรือยังสามารถเกิดขึ้นกับรุ่นที่ใหม่กว่าได้หรือไม่
มีอะไรอีกที่เป็นตัวการสำคัญสำหรับแผนการที่หายไป? ฉันได้อ่านบทความบางส่วนในหัวข้อนี้ แต่ดูเหมือนว่าไม่มีอะไรเหมาะสม
ปรับให้เหมาะสมสำหรับเวิร์กโหลด adhocเปิดใช้งานบนเซิร์ฟเวอร์ที่ฉันกำลังดูในสัปดาห์นี้ หนึ่งในกระบวนงานที่เก็บไว้จะดำเนินการวันละครั้งเท่านั้น ฉันมีรหัสสำหรับอันนั้น ฉันไม่มีรหัสสำหรับรหัสที่ทำงานมากกว่า 100 ครั้งต่อนาที แต่ฉันสามารถรับได้ ฉันจะไม่สามารถโพสต์รหัสได้ แต่ฉันสามารถอธิบายได้เกี่ยวกับคำถามของฉัน
ฉันไม่เชื่อว่าทุกคนกำลังเพิ่มแคชโพรซีเดอร์หรือปล่อยบัฟเฟอร์แบบคลีน ลูกค้ารายนี้ใช้ Solarwinds DPA เป็นหนึ่งในเครื่องมือการตรวจสอบของพวกเขา DPA ได้รวบรวมหนึ่งในแผนการดำเนินการสำหรับคำสั่งใน proc ที่เก็บไว้ซึ่งถูกเรียกวันละครั้ง คำสั่งนั้นมีจำนวนการอ่านจำนวนมากเนื่องจากWHERE
ส่วนคำสั่งที่ไม่สามารถโต้แย้งได้ หาก DPA บันทึกคำสั่งแสดงว่าเป็นแผนโดยประมาณและอยู่ในแคชแผนพร้อมกัน ไม่มีเมื่อเราทำการแก้ไขปัญหา ฉันจะให้พวกเขาเริ่มเข้าสู่sp_WhoIsActive
ตาราง
sp_BlitzCache
ฉันใช้ (ฉันทำงานให้กับ Brent Ozar Unlimited) สิ่งนี้จะแสดงแผนสำหรับขั้นตอนการจัดเก็บทั้งหมดรวมถึงแผนสำหรับแถลงการณ์แต่ละรายการหากมีอยู่ หากไม่มีอยู่จะมีคำเตือนนี้ "เราไม่พบแผนสำหรับการสืบค้นนี้สาเหตุที่เป็นไปได้สำหรับสิ่งนี้ ได้แก่ ไดนามิก SQL RECOMPILE
คำแนะนำและรหัสที่เข้ารหัส" และคำเตือนนั้นอยู่ในงบเช่นกัน
TF 2371 ไม่เข้าที่ ฉันกำลังดูสถิติการรอ เซิร์ฟเวอร์ค่อนข้างน่าเบื่อ PLE มากกว่า 130,000
ตอนนี้ฉันมีรหัสสำหรับกระบวนงานที่เก็บไว้อีก 2 รายการ หนึ่งในนั้นคือการใช้ SQL แบบไดนามิกexec (@sql)
เพื่อให้เรารู้ว่าทำไมไม่มีแผนสำหรับมัน แต่อีกอันหนึ่งและนี่คืออันที่ทำงานมากกว่า 100 ครั้งต่อนาทีไม่มีอะไรผิดปกติ สิ่งเดียวที่เห็นได้ชัดคือมีการสร้างตารางชั่วคราวระหว่างรหัสมากกว่า 1,000 บรรทัด มันจะเรียกกระบวนการจัดเก็บของเด็กด้วย
เกี่ยวกับการแคชแผนใน SQL Server 2008ฉันไม่เห็นตัวอักษรใด ๆ > = 8k แต่หนึ่งในกระบวนงานที่เก็บไว้มีความคิดเห็นเกี่ยวกับการแทรกจำนวนมากก่อนที่จะเรียกกระบวนงานที่เก็บไว้อื่น แต่การแทรกจำนวนมากไม่ปรากฏในขั้นตอนการจัดเก็บด้านนอกที่ฉันกำลังดู ส่วน "เกณฑ์การรวบรวมใหม่" ของบทความนั้นน่าสนใจ สิ่งที่ฉันเห็นสำหรับตารางชั่วคราวคือ INSERT จำนวนมาก (ซึ่งอาจส่งผลให้เกิดแถวหลายล้านแถว) อัปเดตและลบบางอย่าง ข้อมูลจำนวนมากจึงเปลี่ยนเป็นตารางชั่วคราว ล้าน