คำถามติดแท็ก plan-cache

1
วางแผนขนาดแคชและหน่วยความจำที่สงวนไว้
เมื่อรันเคียวรีรวมถึงแผนการดำเนินการตามจริงผู้ดำเนินการรูท ( SELECT) จะบอกฉันว่าขนาดแผนแคชคือ 32KB แบบสอบถามที่เข้าร่วมsys.dm_exec_cached_plansและsys.dm_os_memory_objectsมองไปที่แผนดังกล่าวกล่าวว่าค่าสำหรับpages_in_bytesและmax_pages_in_bytesคือ 32768 (32KB) ซึ่งตรงกับขนาดแผนแคช สิ่งที่ฉันไม่เข้าใจคือสิ่งที่มีค่าsys.dm_exec_cached_plans.size_in_bytesซึ่งคือ 49152 (48KB) ฉันได้อ่าน BOL ในคอลัมน์เหล่านี้ทั้งหมดและโดยเฉพาะsize_in_bytesที่บอกว่า: " จำนวนไบต์ที่ใช้โดยวัตถุแคช " ฉันไม่สามารถรับจิ๊กซอว์ชิ้นสุดท้ายได้เพื่อทำความเข้าใจความหมายของมัน ฉันรู้ว่าตัวดำเนินการทั้งหมด (ไม่ได้พูดถึงการให้สิทธิ์หน่วยความจำเพิ่มเติมที่ใช้สำหรับการเรียงลำดับและแฮช) ต้องใช้หน่วยความจำคงที่จำนวนหนึ่งเพื่อจัดเก็บสถานะทำการคำนวณ ฯลฯ ซึ่งจัดเก็บไว้ด้วยแผนเพิ่มประสิทธิภาพในแคช ดังนั้นคำถามของฉันคือ: อะไรsize_in_bytesจริงๆหมายถึง เพราะเหตุใดจึงมีมูลค่าสูงกว่า "ขนาดแผนแคช" จำนวนหน่วยความจำคงที่สำหรับตัวดำเนินการทั้งหมด / ตัวจองที่จองไว้กับ "ขนาดแผนแคช" (32Kb ในตัวอย่างของฉัน) หรือที่อื่น? ฉันรู้ว่าพวกเขาเป็น DMV ที่แตกต่างกันและมีฟังก์ชั่นต่างกัน แผนเรียบเรียง (แคช) sys.dm_exec_cached_plansรวมsys.dm_os_memory_objectsในmemory_object_addressคอลัมน์ เหตุผลที่ฉันโพสต์คำถามที่นี่คือฉันขอความช่วยเหลือในเรื่องนี้เข้าใจวิธีตีความ DMV และคอลัมน์ของพวกเขา ถ้าsize_in_bytesขนาดของแผนแคชทำไม SQL Server ถึงพูดถึงค่าอื่นในแผนการดำเนินการจริง แบบสอบถามใหม่หมายเลขใหม่: แผนจริง …

2
ความรู้สึกและประโยชน์ของการใช้ SqlCommand.Prepare () คืออะไร?
ฉันเจอรหัสนักพัฒนาซอฟต์แวร์ที่ SqlCommand.Prepare () (ดู MSDN)วิธีการใช้อย่างกว้างขวางล่วงหน้าก่อนการดำเนินการของแบบสอบถาม SQL และฉันสงสัยว่าประโยชน์ของสิ่งนี้คืออะไร? ตัวอย่าง: command.Prepare(); command.ExecuteNonQuery(); //... command.Parameters[0].Value = 20; command.ExecuteNonQuery(); ฉันได้เล่นไปรอบ ๆ เล็กน้อยและติดตาม การดำเนินการของคำสั่งหลังจากเรียกPrepare()วิธีทำให้ SQL Server ดำเนินการคำสั่งต่อไปนี้: declare @p1 int set @p1=1 exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20' select @p1 หลังจากนั้นเมื่อพารามิเตอร์ได้รับมันเป็นค่าและSqlCommand.ExecuteNonQuery()ถูกเรียกต่อไปนี้ได้รับการดำเนินการใน Sql-Server: exec sp_execute 1,@id=20 สำหรับฉันแล้วดูเหมือนว่าคำสั่งจะได้รับการรวบรวมเมื่อPrepare()มีการดำเนินการในไม่ช้า ฉันสงสัยว่าประโยชน์ของสิ่งนี้คืออะไร นี่หมายความว่าใส่ลงในแคชแผนและสามารถนำกลับมาใช้ใหม่ได้ทันทีที่มีการดำเนินการคิวรีสุดท้ายด้วยค่าพารามิเตอร์ที่ต้องการ? ฉันคิดออก (และบันทึกไว้ในคำถามอื่น …

2
ไม่มีแผนการดำเนินการสำหรับกระบวนงานที่เก็บไว้
อะไรคือสาเหตุของแผนที่จะหายไปจากแคชสำหรับขั้นตอนการจัดเก็บ? WITH RECOMPILE SQL แบบไดนามิก รหัสที่เข้ารหัส การเปลี่ยนแปลงข้อมูลที่สำคัญ อัปเดตสถิติ มีอะไรอีกบ้าง? ฉันทำงานกับเซิร์ฟเวอร์ 2 เครื่อง (SQL Server 2008 R2 และ SQL Server 2012) เมื่อเร็ว ๆ นี้ที่ไม่มีแผนในแคชสำหรับขั้นตอนการจัดเก็บที่ใช้ทรัพยากรมาก คำสั่งจำนวนมากอาจทั้งหมดในกระบวนการที่เก็บไว้ยังไม่มีแผนในแคช โพรซีเดอร์ที่เก็บไว้บางตัวรันค่อนข้างบ่อยเหมือนสองสามครั้งต่อวินาที ไม่มีแรงกดดันด้านความจำ แต่อย่างใด เซิร์ฟเวอร์ตัวใดตัวหนึ่งมีฮาร์ดแวร์มากกว่าที่ต้องการ ฉันคิดว่าแผนที่ขาดหายไปเกิดจากการสร้างตารางชั่วคราวในระหว่างขั้นตอนการจัดเก็บ แต่ดูเหมือนจะเป็นข้อมูลเก่าจาก SQL Server 2000 หรือเก่ากว่า เริ่มต้นด้วย SQL Server 2005 การคอมไพล์ใหม่เกิดขึ้นที่ระดับคำสั่งสำหรับคำสั่งหลังจาก DDL เป็นจริงในทุกกรณีหรือยังสามารถเกิดขึ้นกับรุ่นที่ใหม่กว่าได้หรือไม่ มีอะไรอีกที่เป็นตัวการสำคัญสำหรับแผนการที่หายไป? ฉันได้อ่านบทความบางส่วนในหัวข้อนี้ แต่ดูเหมือนว่าไม่มีอะไรเหมาะสม ปรับให้เหมาะสมสำหรับเวิร์กโหลด adhocเปิดใช้งานบนเซิร์ฟเวอร์ที่ฉันกำลังดูในสัปดาห์นี้ หนึ่งในกระบวนงานที่เก็บไว้จะดำเนินการวันละครั้งเท่านั้น ฉันมีรหัสสำหรับอันนั้น ฉันไม่มีรหัสสำหรับรหัสที่ทำงานมากกว่า 100 …

1
มันจะเป็นการดีกว่าถ้าหากแผนแบบสอบถามที่จะถูกแยกโดยคำสั่งเพื่อการใช้งานใหม่?
จากความรู้ที่ จำกัด ของฉันเกี่ยวกับวิธีรวบรวมแผนแบบสอบถามจัดเก็บและดึงข้อมูลโดยแบบสอบถามฉันเข้าใจว่าแบบสอบถามหลายคำสั่งหรือกระบวนงานที่เก็บไว้จะสร้างแผนแบบสอบถามซึ่งจะถูกเก็บไว้ในแคชแผนแบบสอบถามที่จะใช้โดยแบบสอบถามในการดำเนินการในอนาคต ฉันคิดว่าแผนนี้ถูกดึงมาจากแคชแผนแบบสอบถามด้วยแฮชคิวรีซึ่งหมายความว่าหากมีการแก้ไขคิวรีและดำเนินการแฮชจะแตกต่างกันและมีการสร้างแผนใหม่เนื่องจากไม่พบแฮชที่ตรงกันในแคชแผนคิวรี คำถามของฉันคือ: หากผู้ใช้ดำเนินการคำสั่งที่เป็นหนึ่งในงบในแบบสอบถามหลายงบสามารถใช้ส่วนที่เกี่ยวข้องของแผนแบบสอบถามที่มีอยู่แล้วในแคชสำหรับแบบสอบถามหลายงบ? ฉันคาดหวังว่าคำตอบนั้นไม่ใช่เพราะค่าแฮชจะไม่ตรงกัน แต่จะดีกว่าหรือไม่ที่จะแฮชแต่ละคำสั่งในแบบสอบถามแบบหลายคำสั่งเพื่อให้ผู้ใช้สามารถเรียกใช้คำสั่งแต่ละรายการจากแบบสอบถามได้หรือไม่ ฉันคาดหวังว่าจะมีภาวะแทรกซ้อนที่ฉันไม่ได้คำนึงถึง (และนี่คือสิ่งที่ฉันต้องการทราบจริงๆ) แต่ดูเหมือนว่าเราสามารถจัดเก็บ 'แผนคำสั่ง' ที่เหมือนกันในแผนแบบสอบถามจำนวนมากที่ใช้พื้นที่มากขึ้นและใช้มากขึ้น CPU และเวลาในการสร้าง อาจเป็นเพียงการแสดงความไม่รู้ของฉันว่า

1
การวัดการขับไล่แผน
เรามี SQL Server 2016 SP1 โดยมีหน่วยความจำสูงสุดตั้งไว้ที่ 24GB เซิร์ฟเวอร์นี้มีคอมไพล์จำนวนมากโดยมีเพียง 10% ของคอมไพล์เหล่านี้มาจากคิวรี Ad-Hoc ดังนั้นแผนที่รวบรวมใหม่ควรเก็บไว้ในแผนแคช แต่ขนาดของแผนแคชจะไม่เพิ่มขึ้น (ประมาณ 3.72GB) ฉันสงสัยว่ามีแรงกดดันหน่วยความจำท้องถิ่นที่นำไปสู่การลบแผนจากแคช ขีดจำกัดความดันแคชของแผนคือ 5GB (75% ของหน่วยความจำเป้าหมายที่มองเห็นได้จาก 0-4GB + 10% ของหน่วยความจำเป้าหมายที่มองเห็นได้จาก 4GB-64GB + 5% ของหน่วยความจำเป้าหมายที่มองเห็น> 64GB) เมื่อ cachestore ถึง 75% ของขีด จำกัด แรงดันควรลบแผนออกจากแคช ในกรณีของฉัน 75% จาก 5 GB คือ 3.75GB ดังนั้นจึงเป็นไปได้ที่จะเป็นสาเหตุของการคอมไพล์สูง มีวิธีวัด (perfmon, Extended events, ... ) …

1
การเปลี่ยนการตั้งค่าหน่วยความจำสูงสุดจะทำให้แผนการค้นหาไม่ถูกต้องหรือไม่
ฉันเพิ่งลดหน่วยความจำสูงสุดจากค่าเริ่มต้น (ไม่ จำกัด ) ลงเหลือ 20 GB สิ่งนี้ลบข้อความค้นหาที่เก่าที่สุดในแคชแผนหรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.