SQL Server 2012を使用しています。最終的に調整されるストアドプロシージャがありますが、1つ質問があります。サーバーのメモリは32 GBで、SQL Serverに割り当てられている最大メモリは20 GBです。このSPを実行すると、論理読み取りは約4000000なので、8Kで4Mのデータページ時間を1024で除算すると、メモリに30 GB相当のデータが取得されます。
私の質問は、20 GBのメモリしか割り当てていない場合、SQL Serverはどのようにして30 GBのデータをメモリに保持できるのですか?私の質問はばかげて見えるかもしれませんが、あなたの助けが必要です。ありがとう
ここでの計算は、状況、SQL Serverに割り当てられているメモリの量、およびこのクエリで読み取られたデータの量とは関係ありません。 SQL Serverがどのように機能するかという関連概念は、欠けているものです。
SQL Serverは、クエリの実行中に読み取られるすべてのデータを格納するためにメモリを使用しません。十分なメモリがあり、クエリが多くのメモリを使用しない場合、それは確かにそれを行うことができます。ただし、大きな結果を返すクエリ、大きな結果を並べ替える必要があるクエリ、または(ここに大量のメモリが必要な理由を挿入)場合、SQL Serverは最終的にTempDBを使用してそのデータを格納します。
SQL Serverが使用するメモリのほとんどは、データページをバッファリングしてディスクから読み取る必要性を減らすためのものです。最速のSSDであっても、ディスクアクセスはメモリアクセスよりもはるかに低速です。したがって、たとえばギガバイトを使用して結果をソートする必要がある単一のクエリの場合、SQL Serverは、ソートするためにバッファからギガバイトのデータを削除する代わりにtempdbを使用します。そのように機能した場合、1つの不良クエリがSQL Serverをメモリ不足で実行し、バッファを空にする可能性があり、一般的にパフォーマンスが低下します。
最初に、スキャンカウントは17です。つまり、同じデータセットを何度も繰り返し読み取り、それらのtotalは4616999論理読み取りです。まったく同じデータセットが17回再読み取りされると仮定すると、30 GBを17で割ると、ディスクから読み取られたデータの量が得られます。したがって、最初のパスではsom 1.8 GBのデータを読み取り、次に同じデータセットを16倍以上再読み取りします。 1.8 GBのデータをメモリに収めても問題ありません。
次に、スキャンカウントが1で、データがメモリに収まらない場合でも、問題はどこにあるのでしょうか。一部のデータを読み取るとき、そのデータは、読み取り操作中にさらに進むにつれて、読み取り中に後でメモリから削除できます。
最後に、統計IOからの「物理読み取り」にだまされないでください。物理I/Oを先読み、BLOB読み取りなどとして実行することもできます。論理読み取りを合計して物理読み取りの合計を取得した後、必ず行全体とすべての数値を読み取ってください。また、perfmonバッファーキャッシュヒット率カウンターには先読みが含まれていないため、誤解を招く恐れがあります。