30

あるデータベースから行をフェッチし、同期のために別のデータベースに挿入するデーモンプロセッサを作成しました。boolean表示フラグに基づいて行をフェッチしますsync_done

私のテーブルには数十万の行があります。ですべての行を選択すると sync_done is false、データベースのパフォーマンスの問題が発生しますか?の値を持つ行のみがフェッチさsync_doneれるため、パフォーマンスを向上させるためにその列にインデックスを適用する必要がありますか?sync_donefalse

たとえば、10000行あります。これらのうち、9500はすでに同期されており(sync_done is true)、選択されません。

私がどのように進めるかを提案してください。

4

4 に答える 4

49

このようなクエリの場合、同期されていない行のみをカバーする部分インデックスが最適です。

CREATE INDEX ON tbl (id) WHERE sync_done = FALSE;

ただし、このようなユースケースでは、最初に他の同期方法が望ましい場合があります。

于 2012-08-19T12:47:52.733 に答える
20

テーブルにインデックスを付けるのではなく(ブール値はカーディナリティの低いフィールドです)、代わりにブール値でパーティション化することをお勧めします。

参照:http ://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

于 2012-08-19T14:39:32.300 に答える
2

レコードとブールフィールドを含むテーブルは、それを行う方法である必要があります。

これがあなたを助けるかもしれないと私が信じている何かです...

ビットマップインデックス

PostgreSQLのビットマップインデックスの代替

于 2012-08-19T08:05:12.923 に答える
1

インデックスは確かに役立ちますが、データベースが頻繁に使用される場合に負荷と同時実行の問題を課す可能性のあるポーリングではなく、 SlonySkytoolsLondisteのようなamqpやトリガー/データベースキューベースのアプローチなどの通知方法を検討する価値があるかもしれません。トリガーベースのレプリケーションにSlonyとLondisteの両方を使用しましたが、どちらも優れていることがわかりました。私の好みは、セットアップと管理がはるかに簡単なLondisteです(単純なユースケースがある場合は、古いブランチに固執します)。

于 2012-08-19T09:07:19.013 に答える