【徹底解説】Microsoft SQL Serverのハイブリッドバッファプール ― PMEMを活用したパフォーマンス最適化ガイド
Microsoft®は、SQL Server® 2019(プレビュー)CTP 2.1において、「ハイブリッドバッファプール」という新機能を導入しました。この機能により、永続的メモリ(PMEM)デバイスに格納されたデータベースファイル内のデータページへ直接アクセスできるようになります。
PMEMとは?
PMEM(Persistent Memory)は、メモリバス上に搭載されるソリッドステート型の高性能なバイトアドレス対応メモリデバイスです。他のストレージデバイスと比較して、多くの利点を持っています。
PMEMの主なメリットは以下の通りです。
- フラッシュSSD(Solid State Drive)と比べて、大規模データセットに対してレイテンシのない高速かつほぼリアルタイムのデータアクセスを実現します。
- フラッシュストレージよりも高いスループットを発揮します。
- DRAM(Dynamic Random Access Memory)よりも低コストです。
- CPUでキャッシュ可能である点が大きな強みです。CPU側でキャッシュできないPCIe(Peripheral Component Interconnect)とは異なり、パフォーマンス面で有利です。
- 停電やシャットダウン後もメモリ上のデータを保持します。
PMEMは、IoT(Internet of Things)アプリケーション、サイバー脅威分析、金融取引など、膨大なデータを高速に処理する必要があるアプリケーションのレイテンシ削減に、さまざまな形で活用できます。
押さえておきたい基本概念
ハイブリッドバッファプール機能に関連する主な用語は以下の通りです。
ソリッドステートドライブ(SSD): 半導体メモリを使ってデータを永続的に保存するストレージデバイスです。
バッファ(Buffer): SQL Serverにおけるバッファとは、メモリ上の8KBページのことで、データページやインデックスページと同じサイズです。そのため、バッファキャッシュは8KB単位のページに分割されます。ページは、バッファマネージャーが追加のデータを読み込むためにバッファ領域を必要とするまで、バッファキャッシュに保持されます。データは変更された場合にのみディスクへ書き戻されます。メモリ上で変更されたページは「ダーティページ」と呼ばれ、ディスク上のデータベースイメージと一致しているページは「クリーンページ」と呼ばれます。バッファキャッシュ内のデータは、ディスクに書き戻される前に複数回変更されることがあります。
バッファプール(Buffer Pool): バッファキャッシュとも呼ばれ、すべてのデータベースで共有されるグローバルなリソースで、キャッシュされたデータページを保持します。バッファプールキャッシュの最大・最小サイズは、起動時、またはsp_configureを使用してSQL Serverインスタンスを動的に再構成する際に決定されます。このサイズによって、稼働中のインスタンスで任意の時点にバッファプールへキャッシュできるページ数の上限が決まります。マシン上で他のアプリケーションが大きなメモリ負荷を発生させている場合、バッファプール拡張が確保できる最大メモリは制限されることがあります。
チェックポイント(Checkpoint): 予期しないシャットダウンやクラッシュからの復旧時に、データベースエンジンがトランザクションログ内の変更を適用し始める「既知の正常なポイント」を作成します。チェックポイントでは、ダーティページとトランザクションログ情報がメモリからディスクへ書き込まれ、トランザクションログに関する情報も記録されます。
ダイレクトアクセス(DAX): DAX(Direct Access)はメモリのように動作し、最低限のレイテンシを実現します。アプリケーションはOSのI/Oスタックをバイパスして、永続的メモリを直接変更します。このオプションはNTFSでのみ使用できます。
次の図はDAXの仕組みを示したものです。

出典: https://docs.microsoft.com/en-us/windows-server/storage/storage-spaces/deploy-pmem
ハイブリッドバッファプールとは?
従来のシステムでは、SQL ServerはデータページをDRAMベースのバッファプールにキャッシュしていました。一方、ハイブリッドバッファプールでは、SQL ServerはページをバッファプールのDRAM領域へコピーせず、代わりにPMEMデバイス上のデータベースファイル内のページを直接参照します。システムはメモリマップドI/Oを使用してPMEM上のデータファイルへアクセスします。これは、SQL Serverにおけるデータファイルの「エンライトメント(enlightenment)」とも呼ばれます。
この仕組みにより、DRAMへのページコピーが不要になり、永続ストレージ上のページへアクセスする際にOSのI/Oスタックを使う必要もなくなるため、パフォーマンスが向上します。
システムが直接アクセスできるのは、PMEMデバイス上のクリーンページのみです。ページがダーティになると、システムはそのページをDRAMベースのバッファプールへコピーし、その後、通常のチェックポイント操作のタイミングでPMEMデバイスへ書き戻します。
ハイブリッドバッファプール機能は、Windows®とLinux®の両方で利用できます。PMEMデバイスは、DAX(DirectAccess)をサポートするファイルシステムでフォーマットされている必要があります。DAXがサポートするファイルシステムは以下の通りです。
- XFS(Extended File System)
- EXT4
- NTFS(New Technology File System)
SQL Serverは、データファイルが適切にフォーマットされたPMEMデバイス上に存在するかどうかを自動的に検出し、ユーザー空間でメモリマッピングを実行します。このマッピングは、起動時、新しいデータベースのアタッチ・復元・作成時、およびデータベースに対してハイブリッドバッファプール機能を有効化したときに行われます。
ハイブリッドバッファプールの有効化
SQL Server 2019では、ハイブリッドバッファプールを制御するためのDDL(データ定義言語)が導入されました。次の例では、SQL Serverインスタンスに対してハイブリッドバッファプールを有効にします。
ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = ON;
デフォルトでは、ハイブリッドバッファプールはインスタンススコープで無効に設定されています。
注: 設定の変更を反映するには、SQL Serverインスタンスの再起動が必要です。再起動により、サーバー上のPMEM容量全体をカバーするのに十分なハッシュページが割り当てられます。
次の例では、特定のデータベースに対してハイブリッドバッファプールを有効にします。
ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = ON;
デフォルトでは、ハイブリッドバッファプールはデータベーススコープで有効に設定されています。
ハイブリッドバッファプールの無効化
次の例では、SQL Serverインスタンスに対してハイブリッドバッファプールを無効にします。
ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = OFF;
デフォルトでは、ハイブリッドバッファプールはインスタンススコープで無効に設定されています。
注: 設定の変更を反映するには、SQL Serverインスタンスの再起動が必要です。再起動後はサーバーのPMEM容量を考慮する必要がなくなるため、ハッシュページの過剰割り当てが防止されます。
次の例では、特定のデータベースに対してハイブリッドバッファプールを無効にします。
ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = OFF;
デフォルトでは、ハイブリッドバッファプールはデータベーススコープで有効に設定されています。
ハイブリッドバッファプールの構成確認
次の例では、SQL Serverインスタンスにおけるハイブリッドバッファプールのシステム構成の現在の状態を返します。
SELECT * FROM sys.configurations WHERE name = 'hybrid_buffer_pool';
次の例では、2つの結果セットを返します。
SELECT * FROM sys.configurations WHERE name = 'hybrid_buffer_pool';
SELECT name, is_memory_optimized_enabled FROM sys.databases;
- 最初の結果セットは、SQL Serverインスタンスのハイブリッドバッファプールのシステム構成の現在の状態を示します。
- 2番目の結果セットは、データベースの一覧と、各データベースレベルのハイブリッドバッファプール設定を示します。
ハイブリッドバッファプールのベストプラクティス
RAMが16GB未満のインスタンスでは、ハイブリッドバッファプールを有効にしないことをお勧めします。
WindowsでPMEMデバイスをフォーマットする場合は、NTFSで利用可能な最大のアロケーションユニットサイズ(Windows Server® 2019では2MB)を使用し、デバイスがDAX向けにフォーマットされていることを確認してください。また、ファイルサイズは2MBの倍数(2MBで割った余りが0)となるようにしてください。
サーバースコープのハイブリッドバッファプール設定が無効になっている場合、いずれのユーザーデータベースでもハイブリッドバッファプールは使用されません。
サーバースコープの設定が有効になっている場合は、個々のユーザーデータベースに対してデータベーススコープの設定を無効にすることで、そのデータベースでのハイブリッドバッファプールの利用を停止できます。
まとめ
ハイブリッドバッファプールを利用すると、PMEMデバイスに保存されたデータベースのデータページへ直接アクセスできます。ページをDRAMへコピーする必要がなく、OSのI/Oスタックが永続ストレージ上のページへアクセスする必要もないため、システム全体のパフォーマンスが向上します。
詳細については、以下のドキュメントを参照してください。
Microsoft Describes Latest SQL Server 2019 Preview and Azure SQL Improvements
Hybrid Buffer Pool
コメントやご質問がある場合は、フィードバックタブからお気軽にお寄せください。
専門家による管理・運用・構成で環境を最適化
Rackspaceのアプリケーションサービス(RAS)の専門家は、幅広いアプリケーションポートフォリオにわたって、以下のようなプロフェッショナルサービスおよびマネージドサービスを提供しています。
- eコマースおよびデジタルエクスペリエンスプラットフォーム
- ERP(Enterprise Resource Planning)
- ビジネスインテリジェンス
- Salesforce CRM(Customer Relationship Management)
- データベース
- メールホスティングおよび生産性向上ソリューション
私たちがお約束すること:
- 中立的な専門知識: 近代化の道のりを簡素化し、即座に価値をもたらす機能に焦点を当ててご案内します。
- Fanatical Experience™: 「Process first. Technology second.®」のアプローチと専任のテクニカルサポートを組み合わせ、包括的なソリューションを提供します。
- 比類のないポートフォリオ: 幅広いクラウド経験を活かし、適切なテクノロジーを適切なクラウド上に選択・導入するお手伝いをします。
- アジャイルなデリバリー: お客様の現在地に合わせて伴走し、私たちの成功をお客様の成功と一致させます。
まずは今すぐチャットでお問い合わせください。
-
SQL Serverのメモリ最適化テーブルが引き起こすメモリプレッシャーアラートの対処法
Microsoft SQL Serverはメモリ管理に非常に優れたデータベースエンジンですが、環境によってはメモリプレッシャーのアラートが発生し、データベースエンジンが必要なメモリを確保できず、エラーにつながる場合があります。 はじめに 本記事では、SQL Server® 2019(Enterprise Edition)上のメモリ最適化テーブル(In-Memory OLTP)に起因するメモリプレッシャーによって発生する特異な障害シナリオの解決方法を解説します。ここで紹介する手順は、SQL Server 2014以降のバージョンでも同様に適用できます。 画面には次のようなエラーメッセージが表示さ
-
MS Access から SQL Server へデータを移行する方法【初心者向け手順解説】
データベースのサイズが大きくなりすぎてAccessでは管理しきれなくなったため、筆者は最近AccessデータベースからSQL Server 2014へデータを移行しました。作業自体はそれほど難しくありませんが、同じことで悩む方のために、ステップごとの詳しい手順を記事としてまとめておきます。 事前準備:SQL Serverのインストール まず最初に、お使いのパソコンにSQL ServerまたはSQL Server Expressがインストールされていることを確認してください。個人用PCにSQL Server Expressをダウンロードする場合は、必ずAdvanced Services(高度なサ