sql-DBCC freeproccache?

あなたの質問はすべての場所にあるので、私はそれらすべてに対処しようとします。 プロシージャキャッシュは非常に大きいだけです。 プロシージャキャッシュにシングルユースプランが入力されている可能性があります(統計はプランキャッシュに影響しますが、統計には影響しません)。 シングルユースプランの詳細については、Kimberly Trippのブログ記事”plan cache and optimizing for adhoc workloads”を参照してください。sys.dm_exec_cached_plansに対するクエリを含め、キャッシュに多くのシングルユースプランが設定されていることを特定するのに役立ちます。 彼女が示唆しているように、optimize for ad hoc workloadsを使用することで、この膨満感を防ぐことができます。 これを頻繁に行う必要がある場合は、freeproccacheをジョブとしてスケジュールすることは、解決策ではなく、バンドエイドであると言います。

「悪い」計画をクリアするには、まず「悪い」計画を特定する必要があります。 これは、特定のサイズを超える計画や、しばらく実行されていない計画、長時間実行されているクエリなどで特定された計画である可能性があります。 残念ながら、影響を受けるクエリまたはクエリを既に知っていない限り、パラメータスニッフィングの犠牲者であるプランを特定するのは簡単ではあ キャッシュ内で1週間以上実行されていない最も古いプランを見つけたいとしましょう:

;WITH x AS ( SELECT TOP 10 qs., qs.plan_handle, txs = qs.statement_start_offset, txe = qs.statement_end_offset, = cp.size_in_bytes, = SUM(cp.usecounts), = MAX(qs.last_execution_time) FROM sys.dm_exec_query_stats AS qs INNER JOIN sys.dm_exec_cached_plans AS cp ON qs.plan_handle = cp.plan_handle WHERE qs.last_execution_time < DATEADD(DAY, -7, CURRENT_TIMESTAMP) GROUP BY qs., qs.plan_handle, cp.size_in_bytes, qs.statement_start_offset, qs.statement_end_offset ORDER BY DESC) SELECT x.plan_handle, size, uses, , = COALESCE(NULLIF( SUBSTRING(t., x.txs/2, CASE WHEN x.txe = -1 THEN 0 ELSE (x.txe - x.txs)/2 END ), ''), t.) FROM x CROSS APPLY sys.dm_exec_sql_text(x.) AS t;

今、あなたは本当にこの計画をクリアしたいことを確認する必要があります。 たとえば、そのクエリをCEOが明日実行する可能性のあるものとして認識した場合は、そこに残しておくのが最善です。 計画をクリアしたい場合は、次のようにして直接クリアすることができます:

DBCC FREEPROCCACHE();

これは、DBCC FREEPROCCACHEをグローバルに実行するよりもはるかに多くの作業のように聞こえますが、キャッシュに多くの良い計画がある場合、全体的にユーザーにとっ

それでも、これは本当にバンドエイドのように聞こえる。 キャッシュがジャンクでいっぱいになっていて、キャッシュを解放するまでパフォーマンスがトイレに行く場合は、アーキテクチャ、クエリの送信方法などをより高いレベルで調べる必要があります。 これは、LINQ2SQLの最初の反復から期待される動作であり、長さが異なる各文字列引数のクエリのプランのバージョンをキャッシュします。 したがって、パラメータが’January’の場合、データ型がVARCHAR(7)VARCHAR(8)として定義されるため、パラメータが’February’の場合とは異なる計画が得られます。 動作が修正されていることはかなり確信していますが、あなたの環境/アプリケーションについて、「悪いアイデア」を正確に探す場所を提案するのに十”