web-dev-qa-db-ja.com

パフォーマンスチューニング:ブール列のインデックスを作成します

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

私のテーブルには数十万のレコードがあります。 sync_doneがfalseのレコードを選択すると、データベースのパフォーマンスの問題が発生しますか?または、sync_done値がfalseのレコードに選択操作を適用するため、そのsync_done列(ブールデータ型)にインデックスを適用してパフォーマンスを向上させる必要がありますか?

たとえば、10000件のレコードがあるとします。これらのうち、9500は既に同期されており(sync_doneはtrue)、残りのレコードのみを選択します(sync_doneはfalse)。最終的に9500レコードは、select操作の対象にはなりません。

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

29
Pavunkumar

このようなクエリの場合、 部分インデックス が最適です。

CREATE INDEX ON tbl (id) WHERE sync_done = FALSE

ただし、このような使用例では、他の同期方法が望ましい場合があります。

44

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

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

18
Johan

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

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

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

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

2
SiB

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

1
Gavin