3

中央サーバーとノードがあるシナリオがあります。サーバーとノードの両方で PostgreSQL を実行できますが、ノードのストレージ スペースは限られています。ノードは高速にデータを収集し、データをローカル DB に書き込みます。サーバーは、ノードからデータを複製する必要があります。Slony-IまたはBucardoでこれを達成する予定です。ノードは、使用されるディスク容量を最小限に抑えるために、設定された間隔でテーブルからすべてのレコードを削除できる必要があります。次のようなスクリプトで構成されるジョブでpgAgentを使用する必要がありますか?

DELETE FROM tablex, tabley, tablez;

スクリプトを実行する実際のバッチ ファイルは次のようになります。

@echo off
C:\Progra~1\PostgreSQL\9.1\bin\psql -d database -h localhost -p 5432 -U postgres -f C:\deleteFrom.sql

?

これがこのタスクを達成するための最良の方法であるか、またはリモート DB からデータを取得し、そのリモート DB をクリアしてリモート ノードのスペースを節約するより効率的な方法を誰かが知っているかどうか、意見を探しています。御時間ありがとうございます。

4

2 に答える 2

3

あなたにとって最も効率的なコマンドはTRUNCATEコマンドです。

TRUNCATE を使用すると、例のようにテーブルを連鎖できます。

TRUNCATE tablex, tabley, tablez;

postgres docs の説明は次のとおりです。

TRUNCATE は、一連のテーブルからすべての行をすばやく削除します。各テーブルに対して非修飾の DELETE と同じ効果がありますが、実際にはテーブルをスキャンしないため、より高速です。さらに、後続の VACUUM 操作を必要とせずに、ディスク領域をすぐに再利用します。これは、大きなテーブルで最も役立ちます。

パラメータとして追加することもできCASCADEます:

CASCADE 指定されたテーブルのいずれか、または CASCADE によってグループに追加されたテーブルへの外部キー参照を持つすべてのテーブルを自動的に切り捨てます。

于 2012-06-05T18:25:05.310 に答える
1

正確なニーズとワークフローに応じて、2つの最良のオプションは、@ Bohemianが提案したように切り捨てるか、新しいテーブルを作成して名前を変更してから削除することです。

主要なプロジェクトの1つでは、後者のcreate / rename/dropメソッドによく似たものを使用しています。これには、テーブルからすべてのデータではなく一部のデータを非常に迅速に削除できる必要がある場合に利点があります。基本的なワークフローは次のとおりです。

  1. 古いテーブルと同じスキーマで新しいテーブルを作成します

    CREATE new_tableLIKE..。

  2. トランザクションで、古いテーブルと新しいテーブルの名前を同時に変更します。

    始める; テーブルの名前をold_tableに変更します。new_tableの名前をテーブルに変更します。専念;

  3. [オプション]新しいテーブルが新しい挿入を喜んで受け入れている間に、古いテーブルで何かを行うことができるようになりました。データを集中型サーバーにダンプしたり、サーバーでクエリを実行したりすることができます。

  4. 古いテーブルを削除します

    DROP old_table;

これは、たとえば7日間のデータを保持し、8日目のデータのみを一度に破棄する場合に特に便利な戦略です。DELETEこの場合の実行は非常に遅くなる可能性があります。データをパーティション(1日に1つ)に保存することで、1日のデータを一度に簡単に削除できます。

于 2012-06-05T20:15:05.810 に答える