web-dev-qa-db-ja.com

SQL Serverのクエリキャッシュをクリアする方法

SQL Server 2005に対して簡単なクエリを実行しました。

SELECT * 
FROM Table 
WHERE Col = 'someval'

私が最初にクエリを実行するときは> 15 secsを取ることができます。その後の実行は< 1 secに戻ります。

SQL Server 2005でキャッシュされた結果を使用しないようにするにはどうすればよいですか。走ってみた

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

しかし、これはクエリの速度には影響しません(それでも< 1 sec)。

184
PaulB

これは良い説明です。それをチェックしてください。

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

リンク先の記事から:

すべてのパフォーマンステストがSQL Serverで行われる場合、最善の方法はCHECKPOINTを発行してからDBCC DROPCLEANBUFFERSコマンドを発行することです。 CHECKPOINTプロセスはSQL Serverの自動内部システムプロセスであり、定期的に発生しますが、このコマンドを発行して現在のデータベースのすべてのダーティページをディスクに書き込み、バッファを消去することが重要です。その後、DBCC DROPCLEANBUFFERSコマンドを実行して、バッファプールからすべてのバッファを削除できます。

243
Saar

質問は少し古いですが、これはまだ役立つかもしれません。私は同様の問題に遭遇しています、そして、以下のオプションを使うことは私を助けました。これが恒久的な解決策であるかどうかはわかりませんが、現在は修正しています。

OPTION (OPTIMIZE FOR UNKNOWN)

それならあなたの質問はこのようになるでしょう

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

プランキャッシュを消去する8つの方法

1.インスタンス全体のプランキャッシュからすべての要素を削除します。

DBCC FREEPROCCACHE;

これを使用して、計画キャッシュを慎重に消去します。プランキャッシュを解放すると、たとえば、ストアドプロシージャがキャッシュから再利用されるのではなく再コンパイルされます。これにより、クエリパフォーマンスが突然一時的に低下する可能性があります。

2.インスタンス全体のプランキャッシュをフラッシュし、通常の完了メッセージを表示しない

"DBCCの実行が完了しました。DBCCがエラーメッセージを表示した場合は、システム管理者に連絡してください。"

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3.インスタンス全体のアドホックキャッシュと準備済みプランキャッシュをフラッシュします。

DBCC FREESYSTEMCACHE ('SQL Plans');

4. 1つのリソースプールのアドホックキャッシュと準備済みプランキャッシュをフラッシュします。

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

5. 1つのリソースプールのプランキャッシュ全体をフラッシュします

DBCC FREEPROCCACHE ('LimitedIOPool');

6. 1つのデータベースのプランキャッシュからすべての要素を削除します(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.キャッシュからクエリプランを1つ削除します

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

出典 12

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

サーバーのメモリに指定する値は、現在の値と異なる限り重要ではありません。

ところで、スピードアップの原因は、クエリキャッシュではなくデータキャッシュです。

5
erikkallen

SQL Azure/SQL Data WarehouseではDBCC DROPCLEANBUFFERS;DBCC FREEPROCCACHE;もサポートされていないことに注意してください。

ただし、SQL Azureでプランキャッシュをリセットする必要がある場合は、クエリ内のテーブルの1つを変更することができます(たとえば、列を追加してから削除するなど)。これにより、キャッシュからプランが削除されます。 。

私は個人的に、キャッシュされたプランを扱わなくてもクエリのパフォーマンスをテストする方法としてこれを行います。

SQL Azure Procedure Cacheの詳細はこちら

3
MSC