คุณจะล้างแผนแบบสอบถามเก่าทั้งหมดจากภายใน Microsoft SQL Server ได้อย่างไร


12

เรามีแอพพลิเคชั่นชั้นวางที่ใช้ฐานข้อมูล Microsoft SQL ภายในแอปพลิเคชันนี้เราเลือกและเลือกเกณฑ์การเลือกที่หลากหลายสำหรับแต่ละรายงาน แอปพลิเคชันนี้เรียกใช้รายงานเหล่านี้

ฉันเชื่อว่าเรามีปัญหาแผนแบบสอบถาม รายงานฉบับแรกที่เราเรียกใช้ในแต่ละวันทำงานเร็วมาก 7 นาที รายงานใด ๆ ที่เราเรียกใช้หลังจากรายงานแรกใช้เวลาเกินหนึ่งชั่วโมง

ทุกคืนเราเรียกใช้ภารกิจที่กำหนดเวลาไว้ซึ่งหยุดและเริ่ม SQL Server Agent และ SQL Server มีฐานข้อมูลอื่นประมาณ 25 ภายใน SQL อินสแตนซ์หนึ่งนี้ ไม่มีฐานข้อมูลอื่นที่มีปัญหาด้านประสิทธิภาพเพียงอย่างเดียวที่ออกผลิตภัณฑ์ชั้นวางที่ฉันกล่าวถึงก่อนหน้านี้

มีวิธีล้างแผนการสืบค้นทั้งหมดที่ SQL Server มีอยู่ในหน่วยความจำหรือไม่?

ฉันจะทำสิ่งนี้ได้อย่างไรโดยไม่กระทบกับผู้ใช้ 30 รายหรือมากกว่านั้นที่ใช้ฐานข้อมูลอื่นบนเซิร์ฟเวอร์เดียวกัน


คำตอบ:


7

ฉันขอโทษสำหรับคำตอบก่อนหน้าของฉัน

1) เพิ่มตัวเลือก WITH RECOMPILE ในคำสั่ง CREATE PROCEDURE หากคุณรู้ว่าคิวรีของคุณจะแตกต่างกันไปในแต่ละครั้งที่เรียกใช้จากโพรซีเดอร์ที่เก็บไว้ ตัวเลือก WITH RECOMPILE ป้องกันการนำแผนการดำเนินการตามขั้นตอนที่เก็บไว้กลับมาใช้ใหม่ดังนั้น SQL Server จะไม่แคชแผนสำหรับขั้นตอนนี้และกระบวนการดังกล่าวจะถูกคอมไพล์ใหม่ในเวลาทำงาน การใช้ตัวเลือก WITH RECOMPILE สามารถเพิ่มประสิทธิภาพได้หากแบบสอบถามของคุณจะแตกต่างกันไปในแต่ละครั้งที่เรียกใช้จากกระบวนงานที่เก็บไว้เพราะในกรณีนี้แผนการดำเนินการที่ไม่ถูกต้องจะไม่ถูกนำมาใช้

2) คุณต้องสร้างคู่มือแผนที่ใช้คำแนะนำแบบสอบถาม USE PLANสำหรับแบบสอบถามทุกประเภท (ทุกประเภทคำขอขั้นตอนการจัดเก็บ) เพื่อบังคับใช้แผนปฏิบัติการ

นี่คือบทความเกี่ยวกับแผนการดำเนินการที่สามารถช่วยได้


ฉันยอมรับการใช้กับ RECOMPILE ฉันได้ทำสิ่งนี้กับระบบที่ฉันสร้างขึ้น อย่างไรก็ตามฉันไม่สามารถเข้าถึงแหล่ง sql ... มันทำงานจากภายในแอปพลิเคชัน
Michael Riley - AKA Gunny

@Cape Cod Gunny ในกรณีนี้ลอง DBCC FLUSHPROCINDB: ใช้เพื่อล้างแคชโพรซีเดอร์ที่เก็บไว้สำหรับฐานข้อมูลเฉพาะบน SQL Server ไม่ใช่ SQL Server ทั้งหมด คุณอาจต้องการใช้คำสั่งนี้ก่อนการทดสอบเพื่อให้แน่ใจว่าแผนขั้นตอนการจัดเก็บก่อนหน้านี้จะไม่ส่งผลเสียต่อผลการทดสอบ ตัวอย่าง: DECLARE @intDBID จำนวนเต็มตลาดหลักทรัพย์ @intDBID = (SELECT dbid จาก master.dbo.sysdatabases ที่ชื่อ = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
Garik

ปัญหาได้รับการแก้ไขแล้ว มันกลับกลายเป็นว่าตารางชั่วคราวที่ใช้ในการจัดเก็บเกณฑ์การค้นหาได้รับการสะสมข้อมูลตลอดเวลา กระบวนการควรตัดทอนข้อมูลจากตารางนี้ก่อนรวบรวมข้อมูล ขอบคุณสำหรับตัวอย่าง sql ที่ดี
Michael Riley - AKA Gunny

13

คุณถามคำถามสองข้อที่นี่ ก่อนอื่นคุณต้องการทราบว่าคุณสามารถลบแผนทั้งหมดที่เก็บไว้ในหน่วยความจำสำหรับอินสแตนซ์ของ SQL หรือไม่ ที่ทำกับ DBCC FREEPROCCACHE ตามที่ Matt M แนะนำ

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

วิธีแก้ปัญหาสำหรับสิ่งนี้ต้องการการแทรกแซงด้วยตนเอง คุณสามารถใช้ DBCC FREEPROCCACHE เพื่อลบแผนเฉพาะที่ให้คุณมี plan_handle

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

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

คุณควรจะสามารถปรับการค้นหาให้เหมาะสมแทนที่จะหลอกด้วย DBCC FREEPROCCACHE ตามกำหนดเวลา ฉันขอแนะนำให้คุณใช้เวลาวิเคราะห์เหตุการณ์รอเช่นของคุณ


DBCC FREEPROCCACHE ไม่สามารถแก้ไขปัญหาได้ ฉันทำกิจกรรมและกิจกรรมต่างๆ มี 0 I / O ทางกายภาพอยู่ ดูเหมือนว่าจะถูกแขวนไว้ในแอปพลิเคชันนี้:. Net SQL Client Data Provider ประเภทการรอคือ CXPACKET
Michael Riley - AKA Gunny

CXPACKET บอกเป็นนัยว่าแบบสอบถามของคุณขนานกัน คุณสามารถตรวจสอบจำนวนเธรดที่กำลังรันสำหรับเคียวรีและตรวจสอบการรอของเธรดได้หรือไม่? คุณอาจต้องการที่จะใช้เครื่องมือฟรี WhoIsActive อดัม Machanic ของsqlblog.com/files/folders/release/entry29675.aspx
SQLRockstar

7

DBCC FREEPROCCACHE

ใช้คำสั่งนี้คุณสามารถล้างแคชขั้นตอนทั้งหมดลงไปที่คำสั่งเดียว อ่านเอกสารอย่างแน่นอนก่อนที่จะใช้คำสั่งนี้ อ่านข้อสังเกตสองสามครั้ง

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

ด้าน


ฉันลองใช้ DBCC FREEPROCCACHE และไม่สามารถแก้ไขปัญหาได้ ฉันแผลฆ่ากระบวนการหลังจาก 1 ชั่วโมง
Michael Riley - AKA Gunny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.