クリスチャンボルトン、ブレントオザールなどによるSQL Server 2008の内部とトラブルシューティング(イリノイのローカルライブラリから借用)に関する本を読んでいます。私の理解を確認または修正できます。
クエリメモリの付与を必要とするすべてのクエリまたは操作には、ワークスペースメモリが必要です。並べ替え、ハッシュ一致結合、並列処理(これについては不明)、一括挿入(不明)、インデックスの再構築などを使用した一般的なクエリでは、クエリワークスペースメモリが必要です。
ワークスペースメモリはSQL Serverバッファプールの一部であり(バッファプールの一部として割り当てられます)、最大ワークスペースメモリはバッファプールに割り当てられたメモリの75%です。既定では、1つのクエリでワークスペースメモリの25%を超える値を取得することはできません(SQL 2008 / SQL 2012では、リソースガバナーの既定のワークロードグループによって既定で制御されます)。
私の理解の確認を求めて
1)48 GB RAMと最大サーバーメモリが40 GBに設定されたシステムを考えると、これは最大ワークスペースメモリが30 GBに制限され、1つのクエリで10 GBを超えるワークスペースメモリ(クエリメモリ)を取得できないことを意味します。したがって、大量のハッシュ結合を実行している10億行で動作する不適切なクエリがあり、10 GBを超えるメモリ(ワークスペースメモリ)が必要な場合、このメモリ許可キューを介しても、すぐにディスクに流出しても問題ありませんか?
2)大量の並べ替え操作を行うクエリに5 MBのワークスペースメモリが割り当てられ、クエリのクエリ実行中に、クエリオプティマイザが悪い統計またはインデックスの欠落により実際に30 MBのワークスペースメモリを必要とする場合すぐにtempdbに流出します。実行中にシステムが十分なワークスペースメモリを使用できる場合でも、実行中にクエリが許可されたワークスペースメモリを超えると、ディスクにスピルする必要があります。私の理解は正しいですか?