pg_prewarm
はオペレーティングシステムのバッファキャッシュまたはPostgreSQLのバッファキャッシュいずれかにリレーションデータをロードするための便利な方法を提供します。
pg_prewarm(regclass, mode text default 'buffer', fork text default 'main', first_block int8 default null, last_block int8 default null) RETURNS int8
第1引数はプレウォーム(あらかじめロード)したいリレーションを指定します。
第2引数はプレウォームに使用する方法を指定します。詳細は以下でさらに説明します。第3引数はプレウォームされるリレーションフォークを指定します、これは通常main
です。
第4引数は、プレウォームを開始するブロックを指定します(NULL
はゼロとみなされます)。
第5引数は終了ブロックを指定します(NULL
はリレーションの最後のブロックまで指定したとみなされます)。
返り値は、プレウォームされたブロック数です。
プレウォームに使用する方法としては以下の3種類が使用可能です。
prefetch
は、オペレーティングシステムに非同期のプレフェッチをリクエストします。もしオペレーティングシステムやビルド時にプレフェッチをサポートしていない場合はエラーとなります。
read
は、ブロックの要求された範囲を読み込みます。プレフェッチとは違って、すべてのプラットフォームにサポートするようにビルドされていますが、速度が遅くなります。
buffer
は、データベースのバッファキャッシュに要求された範囲を読み込みます。
これらの方法のいずれかでもキャッシュ出来るよりも多くのブロックをプレウォームしようとすると注意が必要です。prefetch
やread
のようなOSのキャッシュを使用する場合、または PostgreSQLのbuffer
にキャッシュする場合、高い番号のブロックが読み込まれると低い番号のブロックが追い出されます。
プレウォームは、キャッシュに対して特別な保護をしていないので、それが他のシステムにとって可能であるように、それらが読み込まれた直後に、新しいプレウォームによって追い出すことが可能です。逆に、プレウォームはキャッシュから他のデータを追い出すこともあります。
これらの理由から、プレウォームはキャッシュが主に空のとき、一般的には起動時にもっとも有用です。
Robert Haas <rhaas@postgresql.org>