pgbenchは、ベンチマーク対象のPostgreSQLのバージョンが14以降の場合、デフォルトではCOPY FREEZEコマンドを使用して、pgbench_accountsテーブルの初期データをロードします。しかし、LD_PRELOADを使用することで、pgbenchの挙動を変更し、(FREEZEオプションが指定されていない)COPYコマンドを使用して、pgbench_accountsテーブルの初期データをロードすることができます。
具体的には、pgbenchはPQserverVersion()関数を使用して、PostgreSQLのバージョンを取得し、バージョンが14以上であればCOPY FREEZEコマンドを使用します。そのため、PQserverVersion()関数をフックして、常にバージョン13を返すようにすることで、pgbenchはCOPYコマンドを使用することができます。
まず、以下のようにPQserverVersion()と同じ関数定義で、常にバージョン13を返す関数を作成します。このプログラムのファイル名はmyPQserverVersion.cとします。
#include "libpq-fe.h"
int PQserverVersion(const PGconn *conn) {
return 130000;
}
次に、この関数を共有ライブラリとしてコンパイルします。
$ gcc -shared -fPIC myPQserverVersion.c -o myPQserverVersion.so -I/path/to/pgsql/include
最後に、LD_PRELOAD環境変数を使用して、先程作成した共有ライブラリを指定してpgbenchを実行します。
LD_PRELOAD=./myPQserverVersion.so pgbench -i
これで、pgbenchはPostgreSQL14以降であっても、COPYコマンドを使用してpgbench_accountsテーブルの初期データをロードするようになります。確認のために、log_statementをallに設定して、FREEZEが指定されていたかどうかを確認することができます。