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=136
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
リンク先の記事から:
すべてのパフォーマンステストがSQL Serverで行われる場合、最善の方法はCHECKPOINTを発行してからDBCC DROPCLEANBUFFERSコマンドを発行することです。 CHECKPOINTプロセスはSQL Serverの自動内部システムプロセスであり、定期的に発生しますが、このコマンドを発行して現在のデータベースのすべてのダーティページをディスクに書き込み、バッファを消去することが重要です。その後、DBCC DROPCLEANBUFFERSコマンドを実行して、バッファプールからすべてのバッファを削除できます。
質問は少し古いですが、これはまだ役立つかもしれません。私は同様の問題に遭遇しています、そして、以下のオプションを使うことは私を助けました。これが恒久的な解決策であるかどうかはわかりませんが、現在は修正しています。
OPTION (OPTIMIZE FOR UNKNOWN)
それならあなたの質問はこのようになるでしょう
select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
DBCC FREEPROCCACHE;
これを使用して、計画キャッシュを慎重に消去します。プランキャッシュを解放すると、たとえば、ストアドプロシージャがキャッシュから再利用されるのではなく再コンパイルされます。これにより、クエリパフォーマンスが突然一時的に低下する可能性があります。
"DBCCの実行が完了しました。DBCCがエラーメッセージを表示した場合は、システム管理者に連絡してください。"
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
DBCC FREESYSTEMCACHE ('SQL Plans');
DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');
DBCC FREEPROCCACHE ('LimitedIOPool');
-- 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);
USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
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);
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO
サーバーのメモリに指定する値は、現在の値と異なる限り重要ではありません。
ところで、スピードアップの原因は、クエリキャッシュではなくデータキャッシュです。
SQL Azure/SQL Data WarehouseではDBCC DROPCLEANBUFFERS;
もDBCC FREEPROCCACHE;
もサポートされていないことに注意してください。
ただし、SQL Azureでプランキャッシュをリセットする必要がある場合は、クエリ内のテーブルの1つを変更することができます(たとえば、列を追加してから削除するなど)。これにより、キャッシュからプランが削除されます。 。
私は個人的に、キャッシュされたプランを扱わなくてもクエリのパフォーマンスをテストする方法としてこれを行います。