ストアドプロシージャは、最初の使用時にコンパイルされます。
キャッシュをクリアするオプションがあります。
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
--To Verify whether the cache is emptied
--DBCC PROCCACHE
または再コンパイルするか、再コンパイルを減らします。
しかし、頻繁に使用されるストアドプロシージャの実行プランを強制的にキャッシュして、メモリに保持することは可能ですか?
私はADO.NETで、つまりSQL Serverの外部からそれを行う方法を知っていますが、この質問はSQLServerの内部で行う方法です-SQLServer自体の起動時に起動されます。
(*)たとえば、SSMSアクティビティモニターに、SQL Serverエージェントが無効でSQLが無効になっているにもかかわらず、tempdbデータベースのコンテキストでT-SQL(プロファイラーによる)を継続的に実行している実行中のプロセス(タスク状態:RUNNING、コマンド:SELECT)が表示されますサーバーには何もロードされていません。「これらのSQLServerセッションはどこから来たのですか? 」の「セッション54の詳細」を参照してください。
ストアドプロシージャを定期的にリサイクルする同様の常駐プロセス(または、SQL Serverの開始サービスまたはセッションによる自動開始)をどのように実行しますか?
関連する質問:
ストアドプロシージャは、最初の実行時に実行が遅くなります
更新:
2でこの質問をフォークする必要があったかもしれませんが、私の主な好奇心は、SQL Serverエージェントを無効にして定期的/ループアクティビティを実行する方法ですか?
上記のRUNNINGSELECTセッション(*)でどのように作成されましたか?
Update2:
大量のデータを読み取る必要があるだけでは説明できない、非常に少量のデータをクエリするストアドプロシージャの実行中に、かなりの遅延が頻繁に発生します。
この質問のコンテキストとして、これ(わずかに小さいデータでのかなりの遅延)を考慮することができますか?