IT

SQL Server 쿼리 캐시를 지우려면 어떻게해야합니까?

lottoking 2020. 5. 15. 08:09
반응형

SQL Server 쿼리 캐시를 지우려면 어떻게해야합니까?


SQL Server 2005에 대해 간단한 쿼리를 실행했습니다.

SELECT * 
FROM Table 
WHERE Col = 'someval'

쿼리를 처음 실행할 때 걸릴 수 있습니다 > 15 secs. 후속 실행이 다시 시작되었습니다 < 1 sec.

SQL Server 2005에서 캐시 된 결과를 사용하지 않도록하려면 어떻게해야합니까? 나는 달리기를 시도했다

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

그러나 이것은 쿼리 속도에 영향을 미치지 않는 것 같습니다 (여전히 < 1 sec).


여기에 좋은 설명이 있습니다. 그것을 확인하십시오.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

링크 된 기사에서 :

모든 성능 테스트가 SQL Server에서 수행되는 경우 가장 좋은 방법은 CHECKPOINT를 발행 한 다음 DBCC DROPCLEANBUFFERS 명령을 발행하는 것입니다. CHECKPOINT 프로세스는 SQL Server의 자동 내부 시스템 프로세스이며 정기적으로 발생하지만이 명령을 실행하여 현재 데이터베이스의 모든 더티 페이지를 디스크에 쓰고 버퍼를 정리하는 것이 중요합니다. 그런 다음 DBCC DROPCLEANBUFFERS 명령을 실행하여 버퍼 풀에서 모든 버퍼를 제거 할 수 있습니다.


계획 캐시를 지우는 여덟 가지 방법

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


질문은 조금 오래되었지만 여전히 도움이 될 수 있습니다. 비슷한 문제가 발생하고 아래 옵션을 사용하면 도움이되었습니다. 이것이 영구적 인 해결책인지 확실하지 않지만 현재 해결 중입니다.

OPTION (OPTIMIZE FOR UNKNOWN)

그런 다음 쿼리는 다음과 같습니다

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

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

What value you specify for the server memory is not important, as long as it differs from the current one.

Btw, the thing that causes the speedup is not the query cache, but the data cache.


Note that neither DBCC DROPCLEANBUFFERS; nor DBCC FREEPROCCACHE; is supported in SQL Azure / SQL Data Warehouse.

However, if you need to reset the plan cache in SQL Azure, you can alter one of the tables in the query (for instance, just add then remove a column), this will have the side-effect of removing the plan from the cache.

I personally do this as a way of testing query performance without having to deal with cached plans.

More details about SQL Azure Procedure Cache here

참고URL : https://stackoverflow.com/questions/1873025/how-can-i-clear-the-sql-server-query-cache

반응형