ฉันจะล้างแคชแบบสอบถาม SQL Server ได้อย่างไร


199

ฉันมีคำถามง่ายๆที่ใช้กับ SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

> 15 secsครั้งแรกที่ผมดำเนินการค้นหาอาจใช้เวลา < 1 secรันที่ตามมาจะกลับมาใน

ฉันจะทำให้ SQL Server 2005 ไม่ใช้ผลลัพธ์ที่แคชได้อย่างไร ฉันพยายามวิ่ง

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

แต่ดูเหมือนว่าจะไม่มีผลกับความเร็วการค้นหา (ยัง< 1 sec)


ซ้ำซ้อน: stackoverflow.com/questions/1856966/…แต่ดีกว่า
Faiz

คำตอบ:


259

นี่คือคำอธิบายที่ดี ตรวจสอบมัน

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

จากบทความที่เชื่อมโยง:

หากการทดสอบประสิทธิภาพทั้งหมดดำเนินการใน SQL Server แนวทางที่ดีที่สุดคือการตรวจสอบ CHECKPOINT จากนั้นออกคำสั่ง DBCC DROPCLEANBUFFERS แม้ว่ากระบวนการตรวจสอบเป็นกระบวนการระบบอัตโนมัติภายในใน SQL Server และเกิดขึ้นเป็นประจำเป็นสิ่งสำคัญที่จะออกคำสั่งนี้เพื่อเขียนหน้าสกปรกทั้งหมดสำหรับฐานข้อมูลปัจจุบันไปยังดิสก์และทำความสะอาดบัฟเฟอร์ จากนั้นคำสั่ง DBCC DROPCLEANBUFFERS สามารถดำเนินการเพื่อลบบัฟเฟอร์ทั้งหมดออกจากบัฟเฟอร์พูล


14
One maight ยังรวมถึง DBCC FREEPROCCACHE
jaraics

1
เมื่อใช้งาน dropcleanbuffers สำหรับทุกคนที่เชื่อมต่อกับฐานข้อมูลหรือเฉพาะผู้ใช้นั้น
Kris Nobels

1
@Kris: DBCC DROPCLEANBUFFERS ลบบัฟเฟอร์ทั้งหมดออกจากบัฟเฟอร์พูล นี่เป็นขั้นตอนที่จำเป็นในการปรับแต่งแบบสอบถามและไม่ควรใช้กับเซิร์ฟเวอร์ SQL แบบสด
ซาร์

สิ่งนี้ทำงานได้ดีสำหรับ SQL Server แต่โปรดทราบว่าสิ่งนี้ไม่ทำงานใน SQL Azure - ฉันโพสต์โซลูชันสำรองด้านล่างเพื่อจัดการสถานการณ์ SQL Azure
MSC

1
ดีนี่เป็นคำสั่งเดียวที่ใช้งานได้จริงลองได้หลายอย่างและไม่ได้ผล
Gabriel Rodriguez

15

แปดวิธีในการล้างแคชแผน

1. ลบองค์ประกอบทั้งหมดออกจากแคชแผนสำหรับอินสแตนซ์ทั้งหมด

DBCC FREEPROCCACHE;

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

2. ล้างแคชแผนสำหรับอินสแตนซ์ทั้งหมดและระงับข้อความเสร็จสมบูรณ์ปกติ

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

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. ล้างเฉพาะกิจและแคชแผนที่เตรียมไว้สำหรับอินสแตนซ์ทั้งหมด

DBCC FREESYSTEMCACHE ('SQL Plans');

4. ล้างแคชเฉพาะกิจและแผนแคชที่เตรียมไว้สำหรับพูลทรัพยากรหนึ่งชุด

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

5. ล้างแคชแผนทั้งหมดสำหรับพูลทรัพยากรหนึ่งรายการ

DBCC FREEPROCCACHE ('LimitedIOPool');

6. ลบองค์ประกอบทั้งหมดออกจากแคชแผนสำหรับฐานข้อมูลเดียว (ไม่ทำงานใน SQL Azure)

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

7. ล้างแคชแผนสำหรับฐานข้อมูลปัจจุบัน

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

8. ลบแผนแบบสอบถามหนึ่งรายการออกจากแคช

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

ที่มา1 2 3


9

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

OPTION (OPTIMIZE FOR UNKNOWN)

จากนั้นคำค้นหาของคุณจะเป็นเช่นนี้

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

1
ไวยากรณ์ไม่ถูกต้องใกล้กับคำหลัก 'OPTION' หรือไวยากรณ์ไม่ถูกต้องใกล้กับ 'UNKNOWN'
pabrams

1
@pabrams สิ่งเหล่านี้เป็นไปตาม (เป็นส่วนหนึ่งของ) การสืบค้นของคุณเช่น:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius

1
เพียงแค่ทำให้แน่ใจว่าคุณไม่ได้วางสิ่งนี้ลงในรหัสการผลิตโดยไม่ได้ตั้งใจเพราะอาจทำให้ MAJOR มีปัญหาได้
Michael K. Campbell

4
การเพิ่มประสิทธิภาพสำหรับ UNKNOWN ไม่ได้เพิกเฉยต่อแผนการแคช แต่เมื่อสร้างแผนจะสั่งให้เซิร์ฟเวอร์ SQL เลือก "ค่าการแจกแจงเฉลี่ยโดยไม่ขึ้นอยู่กับการกำหนดค่าพารามิเตอร์ [อัตโนมัติ] ใด ๆ " สำหรับการตัดสินใจว่าจะสร้างแผนใด - ผลลัพธ์นี้เป็นแผนที่อาจสอดคล้องกันมากกว่าสถิติที่ไม่สม่ำเสมอ OPTION (RECOMPILE) สร้างแผนใหม่แต่ไม่ได้ทำความสะอาด / ปล่อยแคชข้อมูล - ซึ่งโดยปกติจะสร้างแผนในอุดมคติมากขึ้นโดยมีค่าใช้จ่ายในการฟื้นฟูแผนและต้นทุนการแคชแผน
2864740

6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

ค่าใดที่คุณระบุสำหรับหน่วยความจำเซิร์ฟเวอร์ไม่สำคัญตราบใดที่มันแตกต่างจากค่าปัจจุบัน

Btw สิ่งที่ทำให้การเร่งความเร็วไม่ใช่แคชคิวรี่ แต่เป็นแคชข้อมูล


3

โปรดทราบว่าไม่สนับสนุนDBCC DROPCLEANBUFFERS;หรือไม่DBCC FREEPROCCACHE;ได้รับการสนับสนุนในคลังข้อมูล SQL Azure / SQL

อย่างไรก็ตามหากคุณต้องการรีเซ็ตแคชแผนใน SQL Azure คุณสามารถแก้ไขหนึ่งในตารางในแบบสอบถาม (ตัวอย่างเช่นเพียงเพิ่มแล้วลบคอลัมน์) สิ่งนี้จะมีผลข้างเคียงของการลบแผนออกจากแคช .

ฉันเองทำเช่นนี้เป็นวิธีการทดสอบประสิทธิภาพการสืบค้นโดยไม่ต้องจัดการกับแผนแคช

รายละเอียดเพิ่มเติมเกี่ยวกับ SQL Azure Procedure Cache ที่นี่


สิ่งนี้ไม่ได้ผลสำหรับฉันแล้วแผนก็ไม่เปลี่ยนแปลง โปรดดูที่นี่stackoverflow.com/questions/46987785/…
Meneghino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.