インデックスは、PostgreSQLの関連するパーティションのみをスキャンするのに問題なく機能します。ただし、それが機能するためにはすべてを適切に設定する必要があり、 http://www.postgresql.org/docs/current/static/ddl-partitioning.html
認識すべき主なことは、シーケンシャルスキャンを回避するには、PostgreSQLに十分な情報を提供して、一部のパーティションに目的のデータを含めることができないことを証明できるようにする必要があるということです。次に、クエリ結果の潜在的なソースとしてスキップされます。リンク先の記事は、seqスキャンの問題の解決策としてこれを指摘しています。「各パーティションの日付フィールドに範囲制約を追加すると、このクエリを最適化して、「最新の」パーティションを最初にクエリして作業するループにすることができます。残りのすべてのパーティションの範囲よりも高い単一の値が見つかるまで逆方向に戻ります。」-ただし、その変更後に表示される改善された計画は表示されません。
あなたが犯したかもしれないいくつかのよくある間違い:
-postgresql.confファイルのconstraint_exclusionパラメーターはデフォルトでオフになっています。そのデフォルトでは、期待したものが得られません。
-CHECKを使用して重複しないパーティションを作成しませんでした。これにより、プランナーは各パーティションの内部に何があるかを知ることができなくなります。このステップを見逃す可能性がありますが、それでもデータを適切なパーティションに適切に配置します。プランナーはそれを知りません。
-各パーティションにインデックスを付けず、マスターテーブルに1つだけ作成しました。これにより、関連するパーティションだけで順次スキャンが実行されるため、上記ほど悪くはありませんが、良くもありません。
今後のPostgreSQLリリースでは、これをすべて簡単にするための作業がいくつかあります(8.4ではconstraint_partitionの設定はかなり自動化されており、ある種のパーティション設定の自動化が行われています)。今のところ、指示に注意深く従って、これらすべての問題を回避すれば、うまくいくはずです。