【初心者向け】SQL Serverのメモリ構成・役割・仕組みをわかりやすく解説

SQL Server

SQL Serverのメモリとは何かを初心者向けに解説。バッファプールの仕組みやメモリ構成、OSとの関係、最大サーバメモリ(max server memory)の基本まで図解でわかりやすく説明します。

SQL Serverのメモリについて

SQL Serverにおいて、メモリはパフォーマンスを左右する最も重要なリソースのひとつです。

なぜデータベースにメモリが重要なのか

一般的に、データの読み込み速度は以下のような関係になります。

  • メモリ(非常に高速)
  • SSD(高速)
  • HDD(低速)
メモリは非常に高速

SQL Serverはよく使うデータを、非常に高速なメモリ上に保持しておくことで、高速化を実現しています。

SQL Serverがメモリを多く使う理由

SQL Serverのメモリ用途としては主に以下があります。

  • データのキャッシュ(Buffer Pool)
  • 実行計画のキャッシュ(プランキャッシュ)
  • ソートや結合処理などの作業領域
SQL Serverの主なメモリ用途

特に重要なのが「データキャッシュ」です。
これは一度読み込んだテーブルなどのデータをメモリに保持し、次回以降のアクセスを高速化します。

OSとSQL Serverのメモリの関係

SQL Serverは大量のメモリを必要としますが、全メモリをSQL Serverだけに使ってしまうと、OSや他のアプリケーションが動作できなくなる可能性があります。

この問題を防ぐために重要なのが「最大サーバメモリ(max server memory)」の設定です。
こちらの設定方法などは後で説明します。

メモリ不足の症状

メモリが不足すると次のことが起きます。

  • ディスクI/O増加
  • クエリ遅延

SQL Serverのメモリ構成

SQL Serverはメモリを用途ごとにいくつかの領域に分かれて使います。

  • バッファプール
  • クエリ実行用メモリ
  • その他(内部管理)
SQLServerのメモリ構成

SQL Serverのバッファプールとは

バッファプール(Buffer Pool)は、SQL Serverのメモリの中で最も重要な領域で「データページをキャッシュしておくための領域」です。
SQL Serverはデータをディスクから直接読むのではなく、まずBuffer Poolにデータを読み込み、そこから処理を行うことで高速に処理をします。

■ページ(8KB)の概念
SQL Serverはデータを行単位ではなく、8KBのページという単位で扱います。
1つの行だけ必要でも、その行が含まれるページ全体がメモリに読み込まれます。
これにより、近くのデータも一緒にキャッシュされ、効率的なアクセスが可能になります。

実行計画キャッシュとは

実行計画キャッシュ(プランキャッシュ)は、SQL文の「実行手順(実行計画)」を保存しておくためのメモリ領域です。

SQL ServerはSQLを実行するたびに、その都度「どうやって実行するのが最適か」を考えますが、この処理はCPUコストが高いため、一度作った実行計画を再利用します。

特にWebアプリや業務システムでは、同じSQLが繰り返し実行されることが多いため、実行計画キャッシュの効果は非常に大きくなります。

最大サーバメモリ(max server memory)とは

SQL Serverは、デフォルトで搭載されているすべてのメモリを使用するように設定されています。
※SSMSでインスタンスを右クリックして「プロパティ」を開き、メモリで確認すると「最大サーバーメモリ」:2PBが設定されている。

最大サーバメモリ(max server memory)の設定

最大サーバメモリは大きな値に設定されていても、メモリ使用量は必要に応じて増え、負荷が高い場合にほぼ上限まで使い切ることが多いです。

推奨設定は以下のようになっていますが、他に稼働するアプリなどによっても割り振りは変わるので、あくまでも目安です。

搭載メモリ設定
16GBOS:4GB程度確保
SQL Server:12GB程度
32GBOS:4〜6GB確保
SQL Server:26〜28GB
64GBOS:6〜8GB確保
SQL Server:56〜58GB

SQL Serverのメモリ使用状況の確認方法

SQL Serverのメモリチューニングや障害調査では、「今どこにどれくらいメモリが使われているのか」を把握することが重要です。

どの機能がメモリを使用しているかの確認

次のSQLでどの機能がどれだけメモリを使っているかを確認できます。
(BUFFER_POOL(データキャッシュ)、CACHESTORE_SQLCP(プランキャッシュ)など)

SELECT type, SUM(pages_kb) / 1024 AS memory_mb 
FROM sys.dm_os_memory_clerks 
GROUP BY type ORDER BY memory_mb DESC;

パフォーマンスカウンタ

SQL Serverの内部状態を確認できる「パフォーマンスカウンタ」というのがあります。
これはWindowsでいうパフォーマンスモニターのようなもので、SQLで情報を取得できます。

SELECT * 
FROM sys.dm_os_performance_counters;

SQLを実行すると次のような結果になります。

counter_nameの値説明
Total Server Memory

Target Server Memory
「Total Server Memory」は、SQL Serverが確保済みとしているメモリ
「Target Server Memory」は、理想とするメモリ(最適なメモリ)
<目安>
・Total ≒ Target → 安定
・Total < Target → まだメモリが不足している可能性あり
 ※瞬間値ではなく傾向を見るようにします。
Buffer cache hit ratioバッファキャッシュヒット率
<目安>
・90%以上:良好
・80%以下:メモリ不足の可能性
Page life expectancyデータがメモリにどれくらい保持されるか(秒)
<目安>
・300秒以上:最低ライン
・低すぎる:メモリプレッシャーあり

■AWEについて
 昔のWindows(32bit)は最大メモリ:4GB、アプリが使えるメモリ:2GBの制限がありました。
 SQL Serverは大量のデータをメモリに載せる必要があったので、大量の物理メモリを確保しておき、必要に応じて「見える部分」を入れ替えていました。これがAWEという仕組みです。
 
現在は64bit環境が主流なので、AWEの知識は不要と考えてよいです。

コメント

タイトルとURLをコピーしました