Làm cách nào để xóa bộ đệm truy vấn SQL Server?


199

Tôi đã có một truy vấn đơn giản chạy với SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

Lần đầu tiên tôi thực hiện truy vấn có thể mất > 15 secs. Các vụ hành quyết sau đó đã quay trở lại < 1 sec.

Làm cách nào để SQL Server 2005 không sử dụng bất kỳ kết quả được lưu trong bộ nhớ cache nào? Tôi đã thử chạy

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Nhưng điều này dường như không có ảnh hưởng đến tốc độ truy vấn (vẫn < 1 sec).


DUPLICATE: stackoverflow.com/questions/1856966/ Cách nhưng tốt hơn
Faiz

Câu trả lời:


259

Dưới đây là một số giải thích tốt. kiểm tra nó đi.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Từ bài viết được liên kết:

Nếu tất cả các thử nghiệm hiệu năng được tiến hành trong SQL Server, cách tiếp cận tốt nhất có thể là phát hành CHECKPOINT và sau đó ban hành lệnh DBCC DROPCLEANBUFFERS. Mặc dù quy trình CHECKPOINT là quy trình hệ thống nội bộ tự động trong SQL Server và xảy ra thường xuyên, nhưng điều quan trọng là phải ban hành lệnh này để ghi tất cả các trang bẩn cho cơ sở dữ liệu hiện tại vào đĩa và dọn sạch bộ đệm. Sau đó, lệnh DBCPC DROPCLEANBUFFERS có thể được thực thi để loại bỏ tất cả các bộ đệm khỏi nhóm bộ đệm.


14
Một maight cũng bao gồm DBCC FREEPROCCACHE
jaraics

1
Khi sử dụng dropcleanbuffers, cái này dành cho tất cả mọi người được kết nối với cơ sở dữ liệu hay chỉ dành cho người dùng đó?
Kris Nobels

1
@Kris: DBCC DROPCLEANBUFFERS, xóa tất cả bộ đệm sạch khỏi vùng đệm. Đây là bước cần thiết trong điều chỉnh hiệu năng truy vấn và người ta không nên sử dụng nó trên SQL Server trực tiếp.
Saar

Điều này hoạt động tốt cho SQL Server, nhưng xin lưu ý rằng điều này không hoạt động trong SQL Azure - Tôi đã đăng một giải pháp thay thế bên dưới để xử lý kịch bản SQL Azure.
MSC

1
Tốt, đây là lệnh duy nhất thực sự hoạt động, đã thử nhiều thứ khác và không hoạt động.
Gabriel Rodriguez

15

Tám cách khác nhau để xóa bộ nhớ cache của gói

1. Xóa tất cả các thành phần khỏi bộ đệm kế hoạch cho toàn bộ phiên bản

DBCC FREEPROCCACHE;

Sử dụng điều này để xóa bộ nhớ cache kế hoạch một cách cẩn thận. Giải phóng bộ đệm bộ đệm, ví dụ, một thủ tục được lưu trữ sẽ được biên dịch lại thay vì sử dụng lại từ bộ đệm. Điều này có thể gây ra sự giảm đột ngột, hiệu suất truy vấn tạm thời.

2. Xóa bộ nhớ cache của gói cho toàn bộ phiên bản và chặn thông báo hoàn thành thông thường

"Đã thực hiện DBCC. Nếu DBCC in thông báo lỗi, hãy liên hệ với quản trị viên hệ thống của bạn."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Xóa bộ đệm kế hoạch ad hoc và chuẩn bị cho toàn bộ phiên bản

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Xóa bộ đệm kế hoạch ad hoc và chuẩn bị cho một nhóm tài nguyên

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

5. Xóa toàn bộ bộ đệm của gói cho một nhóm tài nguyên

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Xóa tất cả các thành phần khỏi bộ đệm kế hoạch cho một cơ sở dữ liệu (không hoạt động trong 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. Xóa bộ nhớ cache cho cơ sở dữ liệu hiện tại

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

8. Xóa một gói truy vấn khỏi bộ đệm

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);
 

Nguồn 1 2 3


9

Trong khi câu hỏi chỉ là một chút cũ, điều này vẫn có thể giúp đỡ. Tôi đang gặp vấn đề tương tự và sử dụng tùy chọn bên dưới đã giúp tôi. Không chắc đây có phải là giải pháp lâu dài không, nhưng hiện tại nó đang sửa nó.

OPTION (OPTIMIZE FOR UNKNOWN)

Sau đó, truy vấn của bạn sẽ như thế này

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

1
Cú pháp không chính xác gần từ khóa 'TÙY CHỌN'. hoặc Cú pháp không chính xác gần 'UNKNOWN'.
pabram

1
@pabrams Những điều này diễn ra sau (như một phần) truy vấn của bạn như vậy:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Đánh dấu Avenius

1
Chỉ cần làm cho TUYỆT ĐỐI chắc chắn rằng bạn không vô tình bỏ thứ gì đó như thế này vào mã SẢN XUẤT - bởi vì điều đó có thể gây ra các vấn đề CHÍNH.
Michael K. Campbell

4
Tối ưu hóa cho UNKNOWN không bỏ qua các gói được lưu trữ. Thay vào đó, khi tạo một kế hoạch, nó chỉ thị cho máy chủ SQL chọn "giá trị phân phối trung bình, không phụ thuộc vào bất kỳ tham số [tự động] nào để quyết định kế hoạch nào sẽ tạo - điều này dẫn đến các kế hoạch có thể thống nhất hơn trong các thống kê không thống nhất. TÙY CHỌN (RECOMPILE) tạo ra một kế hoạch mới , nhưng không làm sạch / giải phóng bộ đệm dữ liệu - điều này thường tạo ra các kế hoạch lý tưởng hơn với chi phí tái tạo kế hoạch và chi phí lưu trữ kế hoạch.
dùng2864740

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

Giá trị nào bạn chỉ định cho bộ nhớ máy chủ không quan trọng, miễn là nó khác với giá trị hiện tại.

Btw, thứ gây ra sự tăng tốc không phải là bộ đệm truy vấn, mà là bộ đệm dữ liệu.


3

Lưu ý rằng không phải DBCC DROPCLEANBUFFERS;cũng không DBCC FREEPROCCACHE;được hỗ trợ trong Kho dữ liệu SQL Azure / SQL.

Tuy nhiên, nếu bạn cần đặt lại bộ đệm kế hoạch trong SQL Azure, bạn có thể thay đổi một trong các bảng trong truy vấn (ví dụ: chỉ cần thêm rồi xóa một cột), điều này sẽ có tác dụng phụ là xóa kế hoạch khỏi bộ đệm .

Cá nhân tôi làm điều này như một cách để kiểm tra hiệu năng truy vấn mà không phải đối phó với các kế hoạch được lưu trữ.

Chi tiết khác về Bộ đệm thủ tục SQL Azure tại đây


Điều này đã không làm việc cho tôi, sau đó kế hoạch là không thay đổi. Xin vui lòng xem tại đây stackoverflow.com/questions/46987785/
Mạnh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.