ไม่มีแผนการดำเนินการสำหรับกระบวนงานที่เก็บไว้


12

อะไรคือสาเหตุของแผนที่จะหายไปจากแคชสำหรับขั้นตอนการจัดเก็บ?

  1. WITH RECOMPILE
  2. SQL แบบไดนามิก
  3. รหัสที่เข้ารหัส
  4. การเปลี่ยนแปลงข้อมูลที่สำคัญ
  5. อัปเดตสถิติ
  6. มีอะไรอีกบ้าง?

ฉันทำงานกับเซิร์ฟเวอร์ 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 จำนวนมาก (ซึ่งอาจส่งผลให้เกิดแถวหลายล้านแถว) อัปเดตและลบบางอย่าง ข้อมูลจำนวนมากจึงเปลี่ยนเป็นตารางชั่วคราว ล้าน


ในขณะที่คุณมี procs ที่เก็บไว้ซึ่งทำซ้ำปัญหาคุณสามารถสร้างตัวอย่างเล็ก ๆ น้อย ๆ ที่ repros มันและในการทำเช่นนั้นเพื่อหาปัญหา?
Martin Smith

คำตอบ:


3

มีแคชแผน DMF สองแผน:

sys.dm_exec_query_plan - ส่งคืนแผนแคชในรูปแบบ XML แต่ขึ้นอยู่กับขนาดที่กำหนด (และตราบเท่าที่พวกเขาสามารถจัดรูปแบบเป็น XML ใน SQL Server ซึ่งหมายถึงระดับที่ซ้อนกันมากถึง 128)

sys.dm_exec_text_query_plan - ส่งคืนแผนแคชในรูปแบบข้อความทุกขนาด แต่ข้อเสียเปรียบคือเมื่อแผนมีขนาดใหญ่คุณไม่สามารถแปลงเป็น XML ภายใน SQL Server และแม้แต่ TRY_CONVERT เมื่อ XML คืนค่าเป็น null

sp_BlitzCache นิยมเฉพาะ DMV เดิม (เพราะต้องวิเคราะห์แผนคิวรีเป็น XML เพื่อทำการแบ่งส่วนและแบ่งเป็นส่วน ๆ ) ฉันทำให้Github ออก # 838เพื่อปรับปรุงสิ่งนี้เพื่อให้เราสามารถแจ้งเตือนผู้ใช้ให้ไปตรวจสอบ sys.dm_exec_text_query_plan ข้อความค้นหาที่ใหญ่กว่า อย่างไรก็ตามเรายังคงไม่สามารถทำการวิเคราะห์ XML กับมันได้


และด้วยเหตุผลเดียวกันsys.query_store_plan.query_planคือnvarchar(MAX)ไม่ใช่ XML (SQL trivia)
Remus Rusanu

@RemusRusanu ooo แผนขนาดใหญ่ปรากฏขึ้นที่นั่น! ดี
Brent Ozar

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

ฉันกำลังทำเครื่องหมายสิ่งนี้เป็นคำตอบแม้ว่าฉันจะไม่ได้รับการตอบกลับจากลูกค้า มันเป็นสิ่งเดียวที่เหลืออยู่ที่อาจเป็นไปได้ ฉันจะโพสต์การอัปเดตหากมีอะไรเปลี่ยนแปลง
Tara Kizer

@TaraKizer คุณเพียงทำเช่นนี้เพราะความเห็นรายไตรมาสของคุณกำลังจะมาใช่ไหม? ฉันรู้ว่าคุณทำอะไรที่นั่น. โบนัสปลดล็อค
Brent Ozar

0

อาจเป็นไปได้ว่าคุณต้องปรับขนาดสูงสุดของ XML ที่สามารถส่งคืนโดย SSMS เป็นกริดได้หรือไม่


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