シリアル化されたJavaオブジェクトを格納するテーブルに頻繁に更新/アクセスしました。これらは2〜3時間テーブルに存在し(その期間中にも更新されます)、その後削除されます。テーブルのサイズは約300MB。私はそれが非常に、非常に頻繁にVACUUMされており、fillfactor
の変更が役立つかどうか疑問に思っています。
Key-Value DBMSをお勧めしますが、興味があるためここに捨てます。
INSERTおよびDELETEステートメントを実行する代わりに、UPDATEのみを実行します。
テーブル構造は次のようになります
ID integer -- sequential ID
Used boolean -- default FALSE
Object -- whatever type is appropriate
オブジェクトを保持する列は、分割や行の移動を避けるために固定長になります。この列のサイズを変更して、オブジェクトを収容し、ディスク上のページを効率的に埋めます。
必要な数の行といくつかの行をテーブルに事前入力します。
オブジェクトを書き込む場合は、Used = Falseの行を見つけて、その行を更新します。オブジェクトを破棄する場合は、Usedを「False」に設定します。ガベージは作成されないため、ガベージコレクションもありません。
もちろん、処理すべき例外条件は多数あります(行のオーバーフロー、テーブルのオーバーフロー、IDの使用に関する競合条件など)が、克服できないものはありません。