このトピックでは、PolarDB for PostgreSQL および のテーブルサイズキャッシュ機能について説明します。
背景情報
データベースが SQL 文を実行する際、システムテーブル、ユーザーテーブル、およびそれらのインデックスを複数回クエリします。このプロセスにおいて、PolarDB for PostgreSQL および は、ストレージ管理 (smgr) レイヤーの smgrnblocks インターフェイスを頻繁に使用して、テーブルファイル内のブロック数を取得します。smgrnblocks インターフェイスは、ファイルシステムの lseek インターフェイスを使用してファイル長を取得し、ブロックサイズに基づいてブロック数を計算します。smgrnblocks インターフェイスは SQL 処理のクリティカルパス上にあるため、ファイルシステムインターフェイスへの頻繁な呼び出しは、データベースのパフォーマンスに深刻な影響を与える可能性があります。分散ファイルシステム PolarFileSystem (PolarFS) を使用する PolarDB for PostgreSQL および の場合、lseek インターフェイスを呼び出すレイテンシーは、スタンドアロンファイルシステムよりもはるかに高くなります。これにより、SQL 文の実行時間が遅くなります。
ファイルシステムへの呼び出しを減らすために、PolarDB for PostgreSQL および は、テーブルファイル内のブロック数に対してストレージ管理レイヤーでキャッシュを実装しています。このキャッシュは、リレーションサイズキャッシュ (RSC) と呼ばれます。RSC は、テーブルのブロック数を共有メモリにキャッシュします。テーブルのブロック数が変更されると、共有メモリ内のキャッシュされた値が更新されます。テーブルファイル内のブロック数のクエリは、まずキャッシュを使用します。これにより、ファイルシステムへのリクエストが減り、SQL の実行が高速化されます。
適用範囲
この機能は、PolarDB for PostgreSQL の以下のバージョンでサポートされています:
PostgreSQL 18 (マイナーエンジンバージョン 2.0.18.0.1.0 以降)
PostgreSQL 17 (マイナーエンジンバージョン 2.0.17.2.1.0 以降)
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.3.1.1 以降)
PostgreSQL 15 (マイナーエンジンバージョン 2.0.15.7.1.1 以降)
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.12.23.1 以降)
マイナーエンジンバージョン番号は、コンソールで表示するか、SHOW polardb_version; 文を実行して確認できます。マイナーエンジンバージョンの要件が満たされていない場合は、マイナーエンジンバージョンをアップグレードする必要があります。
機能紹介
RSC クエリ
RSC は、共有メモリ内の 1 次元配列とハッシュテーブルで構成されています:
配列内の各キャッシュエントリには、リレーション (テーブルまたはインデックス) のブロック数が格納されます。
ハッシュテーブルは、リレーションの一意のストレージレイヤー識別子 (RelFileNode) と配列内のキャッシュエントリとのマッピングを記録します。
すべてのプロセスは、次の 2 つのレベルのインデックスを使用して RSC をクエリします:
レベル 1 インデックス:最後にアクセスされた RSC キャッシュエントリのポインターと世代 (バージョン番号) をキャッシュします。現在のテーブルが最後のテーブルと同じで、キャッシュエントリの世代が変更されていない場合、プロセスはポインターからテーブルのブロック数を直接取得できます。特定のテーブルに対する読み取り負荷の高いシナリオでは、レベル 1 インデックスのヒット率は高くなります。RSC ハッシュテーブルのマッピングが変更されると、対応する RSC キャッシュエントリの世代が増分され、レベル 1 インデックスが無効になります。
レベル 2 インデックス:レベル 1 インデックスがミスした場合、プロセスは共有メモリ内のハッシュテーブルをクエリして、現在のテーブルの RSC キャッシュエントリを見つけます。ブロック数を取得し、レベル 1 インデックスを更新します。
両方のインデックスレベルで RSC 内のテーブルとそのブロック数が見つからない場合、キャッシュエビクションがトリガーされます。Segmented Least Recently Used (SLRU) アルゴリズムにより、最近使用されていない RSC キャッシュエントリが選択されてクリアされます。次に、ファイルシステムの lseek インターフェイスが呼び出されます。結果として得られたブロック数を使用して、クリアされた RSC キャッシュエントリが更新され、両方のインデックスレベルも更新されます。
プライマリノードとスタンバイノードでの RSC 更新
RSC 機能を有効にした後、テーブルファイルサイズを変更するストレージ管理レイヤーのインターフェイスは、共有メモリ内の対応する RSC キャッシュエントリも更新する必要があります。これにより、キャッシュされたブロック数がファイルシステム内の実際のブロック数と一致することが保証されます。
テーブルファイルを拡張するインターフェイスは、RSC 内の拡張されたテーブルファイルのブロック数を更新します。
テーブルファイルを切り捨てるインターフェイスは、RSC 内の切り捨てられたテーブルファイルのブロック数を更新します。
スタンバイノードは、物理レプリケーションを使用してプライマリノードと同期します。先行書き込みログ (WAL) のリプレイ中に、同じストレージ管理レイヤーのインターフェイスを呼び出してテーブルファイルの長さを変更します。したがって、RSC はプライマリノードと同じ方法で更新されます。
レプリカノードでの RSC 更新
レプリカノードはプライマリノードと物理ストレージを共有し、LogIndex メカニズムを使用して同期します。レプリカノードはストレージに書き込みを行いません。したがって、ストレージ管理レイヤーのインターフェイスを介してメモリ内の RSC キャッシュ値を更新することはできません。
レプリカノードは、WAL レコードで参照されるデータブロック番号を解析し、RSC 内の現在のブロック数と比較します。このプロセスにより、共有ストレージ内のファイル長が変更されたかどうかが判断されます。WAL レコードのブロック番号が現在のキャッシュされたブロック数より大きい場合、RSC キャッシュ値は新しいブロック数に更新されます。ファイルの切り捨てを示す WAL レコードが解析された場合、RSC 内のキャッシュされたブロック数は破棄されます。その後、キャッシュは次回のファイルシステム呼び出し時に再入力されます。
使用ガイド
GUC パラメーター
RSC で使用できる Grand Unified Configuration (GUC) パラメーターは次のとおりです:
パラメーター | 説明 |
polar_enable_rel_size_cache | RSC 機能を有効にするかどうかを指定します。有効な値:
|
polar_enable_replica_rel_size_cache | レプリカノードで RSC 機能を有効にするかどうかを指定します。有効な値:
|
polar_enable_standby_rel_size_cache | スタンバイノードで RSC 機能を有効にするかどうかを指定します。有効な値:
|
パフォーマンステスト
RSC が無効の場合、32 GB のテーブルのブロック数をリクエストするレイテンシーは約 55 us です。
SHOW polar_enable_rel_size_cache; polar_enable_rel_size_cache ----------------------------- off (1 row) SELECT polar_smgrperf_nblocks(32, true, false); NOTICE: testing logical file length with 32 GB INFO: iops=18341.1/s, lat=54.52us INFO: iops=17504.0/s, lat=57.13us INFO: iops=17960.8/s, lat=55.68us INFO: iops=17973.0/s, lat=55.64us INFO: iops=17603.5/s, lat=56.81us INFO: iops=17403.8/s, lat=57.46us INFO: iops=17506.2/s, lat=57.12us INFO: iops=18061.7/s, lat=55.37usRSC が有効の場合、32 GB のテーブルのブロック数をリクエストするレイテンシーは約 0.07 us です。
SHOW polar_enable_rel_size_cache; polar_enable_rel_size_cache ----------------------------- on (1 row) SELECT polar_smgrperf_nblocks(32, true, false); NOTICE: testing logical file length with 32 GB INFO: iops=14155515.6/s, lat=0.07us INFO: iops=13897273.6/s, lat=0.07us INFO: iops=13869926.3/s, lat=0.07us INFO: iops=13779602.7/s, lat=0.07us INFO: iops=14159120.5/s, lat=0.07us INFO: iops=14147065.6/s, lat=0.07us INFO: iops=14124141.9/s, lat=0.07us INFO: iops=14162773.3/s, lat=0.07us