เมื่อคุณเปิดตัวเลือก " เพิ่มประสิทธิภาพสำหรับภาระงาน Ad Hoc " คุณจะทำให้คิวรีแบบเฉพาะกิจที่ทำงานในครั้งที่ 2 นั้นช้าเท่ากับครั้งที่ 1 เพราะคุณจะรวบรวมแผนปฏิบัติการและดึงข้อมูลเดียวกัน ( โดยไม่แคช) 2 ครั้งแรก
สิ่งนี้อาจไม่ใช่เรื่องใหญ่ แต่คุณจะสังเกตเห็นได้เมื่อทดสอบคิวรี
แล้วจะเกิดอะไรขึ้นถ้าไม่มีตัวเลือกนี้เปิดอยู่และแคชที่เต็มไปด้วยคิวรี Ad-Hoc แบบ 1-Off
อัลกอริทึมการจัดการแคช:
เนื่องจากคุณลักษณะการเพิ่มประสิทธิภาพนี้ถูกนำเสนออัลกอริทึมการจัดการแคชได้รับการปรับปรุงด้วย
บทความของ Kimberly Tripp ยังอ้างอิงโพสต์ของ Kalen Delaneyเกี่ยวกับการเปลี่ยนแปลงอัลกอริทึมนี้
เธออธิบายได้ดีที่สุด:
การเปลี่ยนแปลงจริงคำนวณขนาดแคชแผนซึ่ง SQL Server รู้จักว่ามีแรงกดดันหน่วยความจำและจะเริ่มลบแผนการออกจากแคช แผนการที่จะลบออกเป็นแผนราคาถูกที่ไม่ได้ใช้ซ้ำและนี่คือสิ่งที่ดี
ซึ่งหมายความว่าแผนการจับเวลาแบบหนึ่งที่น่ารำคาญเหล่านี้จะเป็นแผนแรกที่จะไปเมื่อคุณต้องการเพิ่มทรัพยากร
ดังนั้นตอนนี้กลายเป็นคำถาม:
" ทำไมเราต้อง 'ปรับให้เหมาะสมสำหรับ Ad Hoc Workloads' เมื่อ SQL Server ดูแลการลบแผนที่ไม่ได้ใช้เมื่อจำเป็น? "
คำตอบของฉันคือถ้าคุณมีการสร้าง oodles แบบไดนามิก sql ที่สร้างขึ้นจำนวนมากของโฆษณาที่ไม่มีพารามิเตอร์ -hoc แบบสอบถามแล้วมันทำให้รู้สึกที่สมบูรณ์แบบในการเปิดคุณลักษณะนี้
คุณต้องการหลีกเลี่ยงการวางสายทรัพยากรระบบเช่นบังคับให้ลบแคชแผน / ข้อมูลหลังจากที่คุณใช้พื้นที่หน่วยความจำแคชสูงสุด
ฉันจะรู้ได้อย่างไรเมื่อฉันต้องเปิดใช้งาน
นี่คือข้อความค้นหาที่ฉันเขียนเพื่อแสดงให้คุณเห็นว่าคุณมีแคชแผน Ad-Hoc จำนวนเท่าไหร่และเนื้อที่ดิสก์เหลืออยู่เท่าไร (ผลลัพธ์จะเปลี่ยนไปตลอดทั้งวันดังนั้นควรทดสอบในช่วงที่โหลดหนัก):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
ผล:
ฉันจะไม่พูดว่า " เมื่อคุณมี X MB " หรือ " หาก X% ของ Ad Hoc ของคุณเป็นแบบใช้ครั้งเดียว " เพื่อเปิดใช้งาน
ไม่มีผลกับ Sprocs, Trigger, Views หรือ Parameterized / SQL ที่เตรียมไว้ - เพียงแค่แบบสอบถาม Ad-Hoc
คำแนะนำส่วนบุคคลของฉันคือการเปิดในสภาพแวดล้อม Prod ของคุณ แต่พิจารณาทิ้งไว้ในสภาพแวดล้อม Dev ของคุณ
ผมพูดแบบนี้เท่านั้นสำหรับ Dev เพราะถ้าคุณเพิ่มประสิทธิภาพแบบสอบถามที่ใช้เวลานาทีหรือมากกว่าที่จะทำงานแล้วคุณไม่ต้องการที่จะเรียกใช้งาน 3 ครั้งก่อนที่คุณอาจจะเห็นวิธีการที่รวดเร็วมันจะไปด้วยกับมันที่แคช - ทุกครั้งเดียวที่คุณแก้ไขเพื่อค้นหาการเพิ่มประสิทธิภาพที่ดีที่สุด
หากงานของคุณไม่เกี่ยวข้องกับการทำสิ่งนี้ตลอดทั้งวันให้ลองบ้าบิ่นและขอให้ DBA เปิดใช้งานได้ทุกที่