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
1つの権限には、DBCC FREEPROCCACHEも含まれます
jaraics

1
dropcleanbuffersを使用する場合、これはデータベースに接続しているすべての人向けですか、それともそのユーザー専用ですか?
クリスノーベルズ2015年

1
@Kris:DBCC DROPCLEANBUFFERS。バッファプールからすべてのクリーンバッファを削除します。これはクエリパフォーマンスチューニングで必要なステップであり、ライブSQL Serverでは使用しないでください。
2015年

これはSQL Serverではうまく機能しますが、SQL Azureでは機能しません。SQLAzureシナリオを処理するための代替ソリューションを以下に掲載しました。
MSC

1
これは、実際に機能し、他の多くの機能を試し、機能しなかった唯一のコマンドです。
ガブリエルロドリゲス

15

プランのキャッシュをクリアする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);
 

ソース1 2 3


9

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

OPTION (OPTIMIZE FOR UNKNOWN)

次に、クエリは次のようになります

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

1
キーワード「OPTION」付近の構文が正しくありません。または「不明」付近の構文が正しくありません。
2013

1
:そのようなクエリ(の一部)の後にこれらの外出を@pabramsselect * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
マークAvenius

1
このようなものを誤ってPRODUCTIONコードに落とさないように絶対に確実にしてください。これは将来的に主要な問題を引き起こす可能性があるためです。
マイケルKキャンベル

4
OPTIMIZE FOR UNKNOWNはキャッシュされたプランを無視しませ。むしろ、プランを生成するときに、作成するプランを決定するために「[自動]パラメータ化とは無関係に平均分散値」を選択するようにSQLサーバーに指示します。これにより、不均一な統計全体でより一貫性のあるプランが得られます。OPTION(RECOMPILE)は新しいプランを作成しますが、それ以外の場合はデータキャッシュを消去/解放しません。これにより、通常、プランの再生成とプランのキャッシュコストを犠牲にしてより理想的なプランが生成されます。
user2864740

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

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

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


3

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

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

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

SQL Azureプロシージャキャッシュの詳細はこちら


これは私にとってはうまくいきませんでした、そして計画は変わりませんでした。こちらをご覧ください。stackoverflow.com
questions / 46987785 /
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.