次のような簡単なクエリがあります。
SELECT *
FROM t1
WHERE f1 > 42
AND f2 = 'foo'
AND f3 = 'bar'
ORDER BY f4 DESC
LIMIT 10 OFFSET 100;
フィールドf4 (他のクエリ用) のインデックスがあります。条件「f1 > 42 AND f2 = 'foo' AND f3 = 'bar'」は代表的なものではなく、テーブル t1 のレコードの 70% に対応します。テーブルには約 2 000 000 のレコードがあり、毎日成長しています。このクエリのクエリ プランの説明は、テーブル全体で seq スキャンを使用し、順序付けと制限を実行することを示しています。
Postgres がこのクエリを次のように実行すると言うことは可能ですか?
- フィールド f4 のインデックスを使用して、逆順の行を反復処理します。
- 各行について、条件 f1 > 42 AND f2 = 'foo' AND f3 = 'bar' との比較を行い、一致する場合はそれを取ります。
- 結果セットのサイズが制限より大きい場合は、反復を停止します。