2012-03-13 12 views
4

今後のプロジェクトにはさまざまなMVCC対応データベースが検討されており、PostgreSQLが私のレーダーに登場しました。1〜2分ごとにPostgreSQL Vacuumを実行できますか?

私のプログラムの要件はおおよそ次のような順序を伴う:

  1. 、データベースの現在のバージョンからいくつかの情報を読み、データの80〜90%を変更し、1に戻ってそれを書いたり、より多くのトランザクション(グリッドの古い状態と新しい状態の両方が必要なConwayのGame of Lifeでグリッドを更新するようなものを想像してください)。

  2. コミット後1-2分待ってください。この間、クライアントは新しいデータに対して読み取りを発行できます。

  3. 繰り返し。

データベースは2〜4GBのように制限されます。

〜90%の変更は既存のオブジェクトの更新です。〜5%は新しいオブジェクトになり、〜5%は削除されたオブジェクトになります。

私の質問は、平らなVACUUMコマンドをステップ1.5として1〜2分に1回実行し、毎回2-3〜GBの変更をPostgreSQLが追いつけられるようにすることができますか?

+5

おそらく手動で実行する必要はありません。特定のテーブルの自動真空設定を調整するだけで十分です。しかし、大量の行を削除または挿入する場合にのみ、本当に必要なのは真空です。アップデートには、そのような積極的な負担は必要ありません。 –

+0

私の理解では、すべてのアップデートで新しいXIDを持つ新しいレコードが生成され、各サイクルのオブジェクトの80〜90%が更新されるため、多くの古いレコードをクリーンアップする予定です。 – MindJuice

+0

ステップ1が実行されている間、クライアントはステップ「0」からのデータベースの「古い」状態に対して読み取りを行っている可能性があるので、古いレコードは新しいものが使用されている間に利用可能である必要がある生成される。 – MindJuice

答えて

5

私はこのシナリオではPostgresがうまくいくはずだと信じています。このシナリオでは、巨大なアップデート間の手作業によるバキュームが合理的な選択肢のように見えることは珍しくありません。

巨大な更新ではなく、新しいテーブルセットを生成して分析し(必要な場合)、トランザクションddlを使用して古いものを削除し、新しいテーブルの名前を変更するそれらの場所に1つ。これはVACUUMについてのあなたの心配を軽減するはずです。

このようなシナリオでは、深刻なチューニングを行う必要があります。特に、shared_buffers、チェックポイント関連のパラメータ、およびバキューム関連のパラメータを見てください。また、現実的なワークロードによるベンチマークについて覚えておいてください。

+0

別々の2つのテーブルを使用し、最後に名前を変更することに関する興味深い提案。それはちょうど私のために働くかもしれない。私はこれについて少し考えます。ありがとう! – MindJuice

+0

テーブルの名前を変更するには、まずテーブルをロックする必要があります。これは、更新のための通常の行ロックよりもはるかに遅いです。 –

+1

@FrankHeikens:これはトレードオフです.OPはほとんどのWHOLEテーブルを更新したいので、簡単な排​​他ロックはVACUUMやものを扱うよりも簡単に簡単です。これは、読者が短いクエリしか発行しない場合に特に当てはまります。代わりに、クライアントでこれを行うと想像することができます - 小さなsearch_pathダンスは、古いリーダーが古いスキーマのテーブルを使用し、新しいリーダーが新しいスキーマのものを使用し、バックグラウンドで別のバージョンを準備していることを意味します。その後、誰にも使われていないスキーマを削除します。 – maniek

関連する問題