DBP FREEPROCCACHE และ DBCC FREESYSTEMCACHE ('แผนการ SQL') ไม่ทำอะไรเลยเพื่อเพิ่มหน่วยความจำ CACHESTORE_SQLCP ฟรี


13

CACHESTORE_SQLCP Sql Plans ใช้เวลา> 38 GB หลังจากสองสามวัน

เรากำลังใช้งานตัวเลือก "เพิ่มประสิทธิภาพสำหรับภาระงาน Ad hoc" (Entity Framework และการรายงานที่กำหนดเองสร้างโฆษณาจำนวนมาก!)

SQL Server 2016 SE 3.00.2164.0.v1 บน AWS RDS พร้อมการจำลองแบบหลาย AZ

เมื่อฉันวิ่ง:

DBCC FREESYSTEMCACHE('SQL Plans');

หรือ

DBCC FREEPROCCACHE

หรือ

DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL

หรือ

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

ดูเหมือนจะไม่ชัดเจนว่า:

SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb  desc

type                name        pages_kb
CACHESTORE_SQLCP    SQL Plans   38321048

ฉันเปิดใช้งานโดยเปิดใช้งาน Query Store แต่ฉันปิดใช้งานเพื่อดูว่าสิ่งใดรบกวนสิ่งใดหรือไม่ดูเหมือนว่าจะช่วยได้ แต่ฉันปิดไป

สิ่งที่แปลกจริงๆก็คือ

SELECT COUNT(*) FROM sys.dm_exec_cached_plans

เป็น 1-3 หรือมากกว่านั้น (ดูเหมือนว่าจะแสดงเพียงแค่เคยแสดงคำค้นหาที่กำลังทำงานอยู่) แม้ว่าหน่วยความจำนั้นสงวนไว้ก่อนที่ฉันจะพยายามล้างสิ่งใดก็ตาม ฉันกำลังคิดถึงอะไร

CACHESTORE_SQLCP ใช้เวลามากกว่า 60% ของหน่วยความจำที่มีอยู่ทั้งหมดซึ่งเป็นข้อกังวลเนื่องจากมีหน่วยความจำรอเกิดขึ้นเป็นครั้งคราว นอกจากนี้เรายังต้องฆ่า DBCC CHECKDB เป็นประจำในช่วงสุดสัปดาห์ที่ยาวนาน 4 ชั่วโมงเพราะหน่วยความจำไม่เพียงพอรอการรอ (มันเสร็จสมบูรณ์ทันทีโดยไม่มีข้อผิดพลาดเมื่อเปิด PHYSICAL_ONLY)

มีวิธีใดบ้างที่จะเรียกคืนหน่วยความจำนี้ (นอกเหนือจากการรีบูตทุกคืน!?)

กราฟปริมาณการใช้หน่วยความจำ แผนภูมิการใช้หน่วยความจำ

อัปเดตจากความเห็น / คำตอบ

เมื่อฉันวิ่ง

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

ฉันเข้าใจ

entity_name subentity_name  permission_name
server      CONNECT SQL
server      CREATE ANY DATABASE
server      ALTER ANY LOGIN
server      ALTER ANY LINKED SERVER
server      ALTER ANY CONNECTION
server      ALTER TRACE
server      VIEW ANY DATABASE
server      VIEW ANY DEFINITION
server      VIEW SERVER STATE
server      ALTER SERVER STATE
server      CREATE SERVER ROLE
server      ALTER ANY SERVER ROLE

ซึ่งรวมถึงการALTER SERVER STATEอนุญาตที่จำเป็น

ผลลัพธ์ของDBCC FREEPROCCACHEคือ

การดำเนินการ DBCC เสร็จสมบูรณ์ ถ้า DBCC พิมพ์ข้อความผิดพลาดติดต่อผู้ดูแลระบบของคุณ

ซึ่งเป็นข้อความมาตรฐาน ฟังก์ชัน DBCC อื่น ๆ ที่ RDS ไม่สนับสนุนให้ข้อความแสดงข้อผิดพลาดเกี่ยวกับการอนุญาต

(หนึ่งวันต่อมาและหลังจากนั้นให้เรียกใช้อีกครั้งแผนการ SQL ยังคงอยู่ที่ 38,321,280 kb)

อัปเดตจากความเห็น / คำตอบ

SELECT pool_id, name, cache_memory_kb, compile_memory_kb FROM sys.dm_resource_governor_resource_pools

เอาท์พุท:

pool_id name    cache_memory_kb  compile_memory_kb
1   internal    38368408         1168080

DBCC FREEPROCCACHE ('internal') ไม่ได้ทำอะไรที่แตกต่าง

ปรับปรุง

บันทึกข้อผิดพลาด SQL บันทึกต่อไปนี้ในแต่ละครั้ง:

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

ปรับปรุง

มีการอัพเกรดเครื่องยนต์ใน RDS จาก 13.00.2164.0.v1 เป็น 13.00.4422.0.v1 แม้ว่ามันจะถูกตั้งค่าให้อัพเกรดอัตโนมัติเป็นรุ่นรอง แต่ก็ไม่ได้ทำให้เรามีการอัพเดทเป็นเวอร์ชั่นล่าสุด จะเริ่มต้นใหม่และติดตั้งวันหยุดสุดสัปดาห์นี้เพื่อดูว่าจะช่วย

คำตอบ:


5

ฉันอัพเกรดเป็น 13.00.4422.0.v1 (SQL Server 2016 SP1) และรีสตาร์ท

จนถึงตอนนี้ฉันสามารถล้างหน่วยความจำ SQL Plan โดยใช้DBCC FREESYSTEMCACHE('SQL Plans');คำสั่ง!

เวลาจะบอกให้ทราบว่ามันใช้หน่วยความจำน้อยในตอนนี้หรือไม่ แต่อย่างน้อยตอนนี้ฉันมีวิธีที่จะรีเซ็ตมันถ้ามันบวมเกินไป


1
แต่ถึงกระนั้นฉันขอแนะนำไม่ให้ล้าง SQLCP บ่อยๆและค้นหาสาเหตุที่แท้จริง
Shanky

Entity Framework และคุณลักษณะการรายงานที่กำหนดเองที่ช่วยให้ผู้ใช้เกือบทุกรายสามารถเรียกใช้เกือบทุกแบบสอบถามสร้างวิธีการสอบถามจำนวนมาก หากมีวิธีการเพียงล้างเหล่านั้นหรือแม้กระทั่งบอกให้พวกเขาไม่เคยแคชในตอนแรกมันอาจช่วยได้ จนถึงตอนนี้แคชแผนได้วนเวียนอยู่ที่ประมาณ 5.8GB ตั้งแต่การติดตั้ง SP1
ชื่อการออกเสียงอย่างมืออาชีพ

Optimize for Ad-Hoc Workloadคุณได้เปิดใช้งาน เมื่อเทียบกับ 38G หากตอนนี้ใช้เวลา 5 GI เชื่อว่านี่จะไม่ใช่สิ่งที่ต้องกังวลเกี่ยวกับการพิจารณาปริมาณงาน
Shanky

ใช่มีการตั้งค่าการเพิ่มประสิทธิภาพสำหรับภาระงาน Ad-Hoc (ตามที่กล่าวไว้ในคำถามข้างต้น)
ชื่อการสร้างเสียงระดับมืออาชีพ

1
เราเห็นปัญหาเดียวกันนี้เมื่อ 13.0.4001.0 ต้องตีกลับ SQL เพื่อล้างแคช proc ไม่มีการรวบรวมใด ๆ แต่แคชของ proc นั้น 'ติดอยู่' และจะไม่ล้างข้อมูลไม่ว่าเราจะพยายามทำอะไร ไม่เคยเห็นมันเกิดขึ้นอีกครั้งตั้งแต่ตีกลับ SQL แต่สงสัยว่ามีหน่วยความจำรั่วหรือข้อบกพร่องบางประเภท
GoodwinSQL

3

ความต้องการ

เพื่อที่จะรันDBCC FREEPROCCACHEหรือบัญชีของคุณต้องได้รับอนุญาตDBCC FREESYSTEMCACHEALTER SERVER STATE

อ้างอิง

  • DBCC FREESYSTEMCACHE (Transact-SQL) (เอกสาร Microsoft)

    ต้องได้รับอนุญาต ALTER SERVER STATE บนเซิร์ฟเวอร์

  • DBCC FREEPROCCACHE (Transact-SQL) (เอกสาร Microsoft)

    ใช้กับ: SQL Server, คลังข้อมูลแบบขนาน

    • ต้องได้รับอนุญาต ALTER SERVER STATE บนเซิร์ฟเวอร์

ผู้ว่าราชการทรัพยากร

AWS RDS อนุญาตสำหรับการตั้งค่าผู้ว่าราชการทรัพยากรหรือไม่ ถ้าใช่แล้วไวยากรณ์คือ:

DBCC FREEPROCCACHE ('<pool_name>'). 

ค้นหาว่าคุณมีพูลด้วย:

SELECT * FROM sys.dm_resource_governor_resource_pools

กำลังตรวจสอบสิทธิ์

รันคำสั่งต่อไปนี้เพื่อตรวจสอบว่าคุณมีสิทธิ์เหล่านี้หรือไม่:

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

ข้อ จำกัด / ข้อ จำกัด

มีข้อ จำกัด บางประการเกี่ยวกับการอนุญาตให้กับผู้ดูแลระบบของอินสแตนซ์ AWS RDS ตามที่ระบุไว้ในบทความMicrosoft SQL Server ใน Amazon RDSในบทการรักษาความปลอดภัยของ Microsoft SQL Server

ที่นี่ภาพรวม:

บทบาทระดับเซิร์ฟเวอร์ต่อไปนี้ไม่สามารถใช้ได้ใน Amazon RDS:

  • BulkAdmin
  • dbcreator
  • diskadmin
  • securityadmin
  • ServerAdmin
  • ดูแลระบบ

สิทธิ์ระดับเซิร์ฟเวอร์ต่อไปนี้ไม่พร้อมใช้งานบนอินสแตนซ์ของ SQL Server DB:

  • การดำเนินการเป็นกลุ่มผู้บริหาร
  • แก้ไขสิ่งที่จำเป็นใด ๆ
  • แก้ไขการแจ้งเตือนใด ๆ
  • แก้ไขเซสชันใด ๆ
  • ตรวจสอบการเปลี่ยนแปลงเซิร์ฟเวอร์ใด ๆ
  • แก้ไขทรัพยากร
  • การเปลี่ยนแปลงการตั้งค่า (คุณสามารถใช้ DB Parameter Group APIs เพื่อแก้ไขพารามิเตอร์สำหรับข้อมูลเพิ่มเติมดูการทำงานกับกลุ่มพารามิเตอร์ DB
  • เซิร์ฟเวอร์ของแท้
  • CONTROL_SERVER
  • สร้างการแจ้งเตือนเหตุการณ์ DDL
  • สร้าง ENDPOINT
  • สร้างการแจ้งเตือนการติดตามเหตุการณ์
  • การเข้าถึงภายนอก
  • SHUTDOWN (คุณสามารถใช้ตัวเลือกการรีบูต RDS แทน)
  • การประกอบที่ไม่ปลอดภัย
  • แก้ไขกลุ่มความพร้อมใช้งานใด ๆ (SQL Server 2012 เท่านั้น)
  • สร้างกลุ่มว่างใด ๆ (SQL Server 2012 เท่านั้น)

ข้อ จำกัด / ข้อ จำกัด เหล่านี้อาจมีการเปลี่ยนแปลงตั้งแต่เอกสารถูกเผยแพร่

แหล่งข้อมูลอื่น ๆ

Brent Ozar เขียนบทความ " SQL Server RDS " ซึ่งเขากล่าวว่า ...

คำสั่ง DBCC จำนวนมากไม่ทำงานเลย - DBCC DBINFOและDBCC LOGINFOถูกปฏิเสธอย่างชัดเจน อย่างไรก็ตามฉันค้นพบว่าฉันสามารถวิ่งได้DBCC FREEPROCCACHEบ่อยเท่าที่ฉันต้องการ

โปรดทราบว่าข้อ จำกัด เหล่านี้อาจมีการเปลี่ยนแปลงเมื่อเวลาผ่านไป - มีการเพิ่มคุณลักษณะใหม่เป็นประจำ

การสนับสนุนของ Amazon

หากบัญชีของคุณมีสิทธิ์ที่จำเป็นและคุณไม่สามารถเพิ่มแคชได้คุณอาจต้องการเปิดตั๋วสนับสนุนกับ Amazon


อัปเดตคำถามพร้อมรายละเอียดเพิ่มเติมตามนี้ ขอบคุณสำหรับการตอบกลับอย่างรอบคอบและละเอียด ฉันพบปัญหาการอนุญาตเกี่ยวกับสิ่งอื่น ๆ ใน RDS แต่ควรได้รับการสนับสนุน ฉันจะติดต่อฝ่ายสนับสนุนของ Amazon ในวันนี้ถ้าฉันไม่ได้ทำกิจกรรมมากที่นี่ ดูเหมือนปัญหา SQL Server มากกว่าปัญหา RDS และฉันไม่รู้ว่าการสนับสนุนของพวกเขามีความรู้หรือเฉพาะเจาะจงจะถูกนำมาเปรียบเทียบกับชุมชนที่ดีนี้ได้อย่างไร!
ชื่อการออกเสียงอย่างมืออาชีพ

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