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>