[sql-server] 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

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

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


답변

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

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

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

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


답변