web-dev-qa-db-ja.com

SQL Serverキャッシュについて

私はトリッキーな質問があり、これに関連する情報を見つける場所が正確にわかりません。

SQL Server 2014 Enterpriseがデータベースサーバーにインストールされています。このサーバーには複数のデータベースが存在し、一部は私たちに属し、一部は他の会社に属しています。

私の懸念はキャッシュメモリです。 SQL Serverがキャッシュメモリを使用してデータページを高速に取得する方法についての基本的な知識があります。クエリを実行すると、通常、データページがキャッシュに読み込まれ、繰り返し可能な呼び出しにより、結果が得られます。

しかし...私たちのアプリケーションは、お客様の通常の勤務時間中に非常に使用されていますが、夜間は常にメンテナンスタスクが行われています。昼間はキャッシュに有用なデータページが読み込まれますが、夜間はメンテナンスタスクのためにキャッシュが削除されるため、翌日、顧客がトランザクションを開始すると想定しています(間違っている場合は教えてください)。最初にデータページを再度キャッシュに読み込む必要があります。これには時間がかかり、多くの処理速度が低下します。

それで、それが起こった場合、どういうわけか私は証明できますか?

はいの場合、管理できますか?どういうわけか、SQL Serverにキャッシュに読み込まないように指示しますか?

このトピックについて説明しているいくつかの特定の記事に感謝します。この問題に名前を付ける方法がわからない、またはよくわかりません。

3
jindrich

夜はメンテナンス作業のため削除されます

削除を「上書き」または「削除」したとは言いません。メンテナンスは単にメモリを他のものに使用する場合があります。通常は大きな問題ではありません。

そのため、翌日、顧客がトランザクションを実行すると、データページを再度キャッシュにロードする必要があり、時間がかかり、多くのことが遅くなります。

それが本当に残忍なケースである場合は、エッジケースかハードウェアの問題のいずれかです。

一般に、メンテナンスの一環として、早朝に多くの「メンテナンスクエリ」を実行して(たとえば、朝の0600にデータをキャッシュにリロードすることにより)、キャッシュを事前設定できます。つまりキャッシュにロードするデータを照会することで終了します。問題が解決しました。

しかし、一般的にこれは極端なスローダウンを引き起こすべきではありません-はい、最初のリクエストは遅くなりますが、キャッシュがすべてのクエリでいっぱいになるため、それはそれ自体をかなり速く修正するはずです。あなたの経験したスローダウンが「キャッシュ」ではなく「朝のスパイク」である可能性はありますか?特定の時間(朝にログインして作業をチェックする朝)に負荷が日中よりも多くなるシステムはたくさんあります。この場合、これを処理するためにハードウェアをスケールアップする必要があります。メンテナンスを非常に重要な問題と見なしたのは初めてのことです。

5
TomTom

あなたはおそらくPLE、または Page Life Expectancy を探しています。 PLEは、データページが平均してキャッシュに存在する秒数です。

SQL Serverは、値がキャッシュ/バッファープールにある場合にのみ、アプリケーションまたはクライアントに値を返します。データ集約型の操作を実行するのに十分なメモリ/ RAMがインスタンスにない場合は、メモリ負荷または非常に低いPLEが表示されます。これは、SQL Serverがデータページを常にキャッシュに移動し、必要な他のデータページのために空き容量を増やし、物理的な読み取り(I/Oが集中するメモリの代わりにディスクから読み取る)を行うことを意味します。

あなたが探しているものを証明するには、インスタンスのノードごとにPLEを15分ごとに1週間ほどキャプチャし始めます。全体的な使用状況と集中的な操作に基づいて、上下に変化するはずです。必要に応じて、いくつかのスクリプトを検索して、負荷の高い操作の読み取り/書き込みをキャプチャし、問題のあるクエリを見つけることもできます。

日常のメンテナンスタスクに関する具体的な例では、それが問題になる可能性があります。一連のインデックスの再構築により、アプリが日中に使用するすべての有用なデータページが消去される可能性があるため、これらのクエリ/プロシージャ/準備されたステートメントが朝に初めて実行されるとき、必要なデータ用のスペースを確保するためにいくつかのデータページをフラッシュする必要がありますディスクから読み込まれました。

DBA Stack Exchangeから盗まれたクエリ:

SELECT [object_name],
[counter_name],
[cntr_value] FROM sys.dm_os_performance_counters -- https://docs.Microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-os-performance-counters-transact-sql
WHERE [counter_name] = 'Page life expectancy' --if multiple NUMA on a server should return multiple Nodes, 
OR [counter_name] = 'Free list stalls/sec'  -- Number of requests per second that had to wait for a free page https://docs.Microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-buffer-manager-object
OR [counter_name] = 'Lazy writes/sec' --Flushes of dirty pages before a checkpoint runs.  
OR [counter_name] = 'Buffer cache hit ratio' --percentage of pages found in the buffer cache without having to read from disk you want this ratio to be high
Order by [counter_name] DESC, [object_name];
1
dfundako