Postgres8.2でパーティショニングを使用するようにデータベースを再構築しました。クエリのパフォーマンスに問題があります。
SELECT *
FROM my_table
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100;
テーブルには4500万行あります。パーティショニングの前に、これは逆インデックススキャンを使用し、制限に達するとすぐに停止します。
(time_stamp範囲で)パーティション分割した後、Postgresはマスターテーブルと関連するパーティションの完全なインデックススキャンを実行し、結果をマージして並べ替え、制限を適用します。これには時間がかかりすぎます。
私はそれを修正することができます:
SELECT * FROM (
SELECT *
FROM my_table_part_a
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
SELECT * FROM (
SELECT *
FROM my_table_part_b
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
... and so on ...
ORDER BY id DESC
LIMIT 100
これはすぐに実行されます。タイムスタンプが範囲外にあるパーティションは、クエリプランに含まれていません。
私の質問は次のとおりです。クエリプランナーがテーブル全体をスキャンするのを防ぐためにPostgres8.2で使用できるヒントや構文はありますが、マスターテーブルのみを参照する単純な構文を使用していますか?
基本的に、現在定義されている各パーティションに大きなUNIONクエリを動的に構築するという苦痛を回避できますか?
編集: constraint_exclusionを有効にしました(@Vinko Vrsalovicに感謝します)