ハイブリッド バッファー プール

適用対象: SQL Server 2019 (15.x) 以降のバージョン

ハイブリッド バッファー プールを使用すると、バッファー プール オブジェクトで、ディスクからデータ ページのコピーを取得して揮発性 DRAM にキャッシュする代わりに、永続メモリ (PMEM) デバイスにあるデータベース ファイル内のデータ ページを参照できます。 この機能は、SQL Server 2019 (15.x) で導入され、SQL Server 2022 (16.x) でさらに強化されました。

ハイブリッド バッファー プールが有効になっている場合と有効になっていない場合のバッファー プールを示す図。

永続メモリ (PMEM) デバイスはバイトアドレス指定可能で、直接アクセス (DAX) の永続メモリ対応ファイル システム (XFS、EXT4、NTFS など) を使用する場合、OS の通常のファイル システム API を使用してファイル システム上のファイルにアクセスできます。 または、SQL Server で、PMEM デバイス上のファイルのメモリ マップに対して "読み込みおよび格納" と呼ばれる操作を実行できます。 これにより、SQL Server などの PMEM 対応アプリケーションは、従来の記憶域スタックを走査することなくデバイス上のファイルにアクセスできます。

ハイブリッド バッファー プールは、この機能を使用して、メモリ マップされたファイルに対して読み込みおよび格納操作を実行し、PMEM デバイスをバッファー プールのキャッシュとデータベース ファイルの保存場所の両方として使用します。 これにより、論理的な読み込みと物理的な読み込みの両方が基本的には同じ操作になるという特殊な状況が生じます。 永続メモリ デバイスは、通常の揮発性 DRAM と同様、メモリ バスを介してアクセスできます。

既定では、クリーンなデータ ページのみがハイブリッド バッファー プールの PMEM モジュールにキャッシュされます。 ページを変更してダーティとしてマークするには、PMEM デバイスから DRAM バッファー プールにコピーして変更し、最終的に変更したページのコピーを DRAM から PMEM モジュールに書き戻す必要があります。その時点で、もう一度クリーンとしてマークできます。 このプロセスは、PMEM モジュールが標準のブロック デバイスであるかのように、チェックポイントやレイジー ライターなどの通常のバックグラウンド操作を使用して行われます。

ハイブリッド バッファー プール機能は、Windows と Linux の両方で使用できます。 PMEM デバイスでは、DAX (DirectAccess) をサポートするファイル システムを使用する必要があります。 XFS、EXT4、NTFS ファイル システムではすべて DAX 拡張機能がサポートされており、ユーザー空間から直接ファイル システムにアクセスできます。 SQL Server によって、適切に構成された PMEM ディスク デバイスにデータベース データ ファイルが存在するかどうかが検出され、データベースの起動時、またはデータベースがアタッチ、復元、または作成されるたびに、データベース ファイルの必要なメモリ マッピングが自動的に実行されます。

詳細については、次を参照してください。

ハイブリッド バッファー プールを有効にする

SQL Server 2019 (15.x) では、ハイブリッド バッファー プールを管理するための動的データ言語 (DDL) が導入されています。

次の例では、SQL Server のインスタンス用にハイブリッド バッファー プールを有効にします。

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = ON;

既定では、ハイブリッド バッファー プールはインスタンスのスコープで無効にされます。 設定の変更を有効にするためには、SQL Server インスタンスを再起動する必要があります。 サーバー上の合計 PMEM 容量を考慮するために十分なハッシュ ページの割り当てを容易にするためには、再起動が必要です。

次の例では、特定のデータベース用にハイブリッド バッファー プールを有効にします。

ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = ON;

既定では、ハイブリッド バッファー プールはデータベースのスコープで有効にされます。

ハイブリッド バッファー プールを無効にする

次の例では、ハイブリッド バッファー プールをインスタンス レベルで無効にします。

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = OFF;

既定では、ハイブリッド バッファー プールはインスタンス レベルで無効にされます。 この変更を有効にするには、インスタンスを再起動する必要があります。 この再起動により、サーバー上の PMEM の容量を考慮する必要があるため、バッファー プールに十分なハッシュ ページが割り当てられます。

次の例では、特定のデータベース用にハイブリッド バッファー プールを無効にします。

ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = OFF;

既定では、ハイブリッド バッファー プールはデータベース スコープでは有効になり、サーバー スコープでは無効になります。

ハイブリッド バッファー プールの構成を表示する

実行時の値を表示する

次の例では、インスタンスの現在のハイブリッド バッファー プール構成の状態を戻します。

SELECT * FROM
sys.server_memory_optimized_hybrid_buffer_pool_configuration;

次の例では、データベースと、ハイブリッド バッファー プールのデータベース レベルの設定 (is_memory_optimized_enabled) をリストします。

また、DAX を有効にせずに PMEM モジュールをマウントまたはフォーマットして、通常のブロック デバイスとして扱うこともできます (つまり、カーネル経由で I/O を実行します)。 このように構成した場合、バイト アドレス指定可能な操作を実行するために SQL Server で PMEM モジュールを使用することはできません (つまり、すべての呼び出しでカーネル領域のドライバーが使用されます)。

SELECT name, is_memory_optimized_enabled FROM sys.databases;

直接書き込みのハイブリッド バッファー プール

"直接書き込み" の動作を備えたハイブリッド バッファー プールにより、変更されたデータまたは PMEM デバイスに存在するインデックス ページで実行する必要がある memcpy コマンドの数が減少します。 これは、DRAM バッファー プールのいずれかにページをコピーすることなく、ページを変更する手段として耐久性のある永続ログ バッファーを使うことによって行われます。 代わりに、PMEM デバイスに存在するデータベース ファイル内のページは、DRAM バッファ プールにキャッシュされることなく直接変更され、後で非同期的にディスクにフラッシュされます。 永続化されたトランザクション ログ バッファー内の (ログ) レコードが耐久性のあるメディアに書き込まれるか、ハード化されているため、この動作は引き続き先行書き込みログ (WAL) セマンティクスに準拠しています。 このようにハイブリッド バッファー プールと永続化されたログ バッファーを一緒に使用すると、トランザクション ワークロードでかなりのパフォーマンスの向上が見られます。

直接書き込みモードを有効にするには、データベースのハイブリッド バッファー プールと永続化されたログ バッファーを有効にし、スタートアップ トレース フラグ 809 を有効にします。

ハイブリッド バッファー プールのベスト プラクティス

  • Windows 上でご利用の PMEM デバイスをフォーマットする場合、NTFS に利用できる最大のアロケーション ユニット サイズ (Windows Server 2019 以降では 2 MB) を使用して、デバイスが DAX (Direct Access) 用に確実にフォーマットされているようにします。

  • Windows の Lock pages in memory ポリシーを有効にします。

  • ファイル サイズは 2 MB の倍数である必要があります (剰余 2 MB はゼロと等しい)。

  • ハイブリッド バッファー プールのサーバー スコープ設定が無効に設定されている場合、この機能はどのユーザー データベースでも使用されません。

  • ハイブリッド バッファー プールのサーバー スコープ設定が有効に設定されている場合、データベース スコープ設定を使用して、個々のユーザー データベースに対してこの機能を無効にすることができます。

  • SQL Server 2019 (15.x) CU 3 の時点で (KB4538118 を参照)、読み取りキャッシュは既定で有効になっています。このプロセスでは、ハイブリッド バッファー プール内で最もホットなページが追跡されて、自動的に DRAM バッファー プールに昇格され、パフォーマンスが向上します。

  • SQL Server 2022 (16.x) CU 1 の時点で、ハイブリッド バッファー プールを永続化されたログ バッファーと組み合わせた場合の既定の動作は "直接書き込み" です。 これにより、ほぼすべてのワークロードのパフォーマンスが向上するはずですが、回帰の可能性は常にあり、適用する前に CU を十分にテストする必要があります。 この動作変更によって回帰が発生した場合は、起動時のトレース フラグ 898 を使用して以前の動作に戻すことができます。

  • SQL Server 2022 (16.x) CU 1 以降、トレース フラグ 809 は起動時に SQL Server によって無視されます。 トレース フラグ 809 とトレース フラグ 898 はどちらも Windows にのみ適用され、SQL Server on Linux には適用されません。 トレース フラグは、認定された Microsoft Server プロフェッショナルから指示された場合にのみ使用する必要があります。