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 명령을 발행하는 것입니다. CHECKPOINT 프로세스는 SQL Server의 자동 내부 시스템 프로세스이며 정기적으로 발생하지만이 명령을 실행하여 현재 데이터베이스의 모든 더티 페이지를 디스크에 쓰고 버퍼를 정리하는 것이 중요합니다. 그런 다음 DBCC DROPCLEANBUFFERS 명령을 실행하여 버퍼 풀에서 모든 버퍼를 제거 할 수 있습니다.


14
하나 maight 또한 DBCC FREEPROCCACHE 포함
jaraics

1
dropcleanbuffers를 사용할 때 이것은 데이터베이스에 연결된 모든 사람이나 그 사용자만을위한 것입니까?
Kris Nobels

1
@Kris : DBCC DROPCLEANBUFFERS, 버퍼 풀에서 모든 클린 버퍼를 제거합니다. 이것은 쿼리 성능 조정에 필요한 단계이며 실제 SQL Server에서는 사용하지 않아야합니다.
Saar

이것은 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

1
실수로 이와 같은 것을 PRODUCTION 코드에 놓지 않도록 확실히하십시오. 중대한 문제가 발생할 수 있기 때문입니다.
Michael K. Campbell

4
알 수 없는 최적화 는 캐시 된 계획을 무시 하지 않습니다 . 대신 계획을 생성 할 때 SQL Server에 "계획을 생성 할 계획을 결정하기 위해"[자동] 매개 변수화와 무관 한 평균 분포 값 "을 선택하도록 지시합니다. 이렇게하면 불균일 한 통계에서보다 일관된 계획이 생성됩니다. OPTION (RECOMPILE)은 계획을 작성 하지만 그렇지 않으면 데이터 캐시를 정리 / 릴리스하지 않습니다. 이는 일반적으로 계획 재생성 및 계획 캐싱 비용을 희생하여 더 이상적인 계획을 생성합니다.
user2864740

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

현재 값과 다른 한 서버 메모리에 지정하는 값은 중요하지 않습니다.

Btw, 속도를 높이는 것은 쿼리 캐시가 아니라 데이터 캐시입니다.


3

SQL Azure / SQL Data Warehouse에서는 지원 되지 DBCC DROPCLEANBUFFERS;도 않습니다 DBCC FREEPROCCACHE;.

그러나 SQL Azure에서 계획 캐시를 재설정해야하는 경우 쿼리에서 테이블 중 하나를 변경 (예 : 열을 추가 한 후 제거)하면 캐시에서 계획을 제거하는 부작용이 있습니다. .

캐시 된 계획을 처리하지 않고도 쿼리 성능을 테스트하는 방법으로 개인적으로이 작업을 수행합니다.

SQL Azure Procedure Cache에 대한 자세한 내용은 여기를 참조하십시오.


이것은 나를 위해 작동하지 않았다면 계획은 변경되지 않았습니다. 여기를 참조하십시오 stackoverflow.com/questions/46987785/…
Meneghino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.