COPY
コマンドは単一のトランザクション内で実行されるため、そのWALデータがwal_buffers
に収まらない場合はどうなりますか?たとえば、CSVファイルから一括インポートする場合です。
ドキュメントとして states :
一般的に使用される内部WAL関数には、LogInsertとLogFlushの2つがあります。 LogInsertは、共有メモリのWALバッファに新しいレコードを配置するために使用されます。新しいレコード用のスペースがない場合、LogInsertはいくつかの満たされたWALバッファーを書き込む(カーネルキャッシュに移動する)必要があります。 LogInsertは、影響を受けるデータページで排他ロックが保持されているときにすべてのデータベースの低レベルの変更(行の挿入など)で使用されるため、これは望ましくありません。そのため、操作をできるだけ高速にする必要があります。さらに悪いことに、WALバッファを書き込むと、新しいログセグメントの作成が強制される可能性があり、これにはさらに時間がかかります。通常、WALバッファーは、LogFlush要求によって書き込まれ、フラッシュされる必要があります。LogFlush要求は、ほとんどの場合、トランザクションのコミット時に行われ、トランザクションレコードが永続ストレージにフラッシュされるようにします。ログ出力が高いシステムでは、LogInsertが書き込みを行う必要がないほど頻繁にLogFlush要求が発生しない場合があります。このようなシステムでは、構成パラメーターwal_buffersを変更して、WALバッファーの数を増やす必要があります。
つまり、このような状況では、書き込みのためにシステムがCOPY
を完了するのにより多くの時間が必要になるということです。