0

次のような簡単なクエリがあります。

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 がこのクエリを次のように実行すると言うことは可能ですか?

  1. フィールド f4 のインデックスを使用して、逆順の行を反復処理します。
  2. 各行について、条件 f1 > 42 AND f2 = 'foo' AND f3 = 'bar' との比較を行い、一致する場合はそれを取ります。
  3. 結果セットのサイズが制限より大きい場合は、反復を停止します。
4

2 に答える 2

4

Hereクエリ プランナーの構成です。それらを操作してクエリプランを変更できます(あなたの場合SET enable_seqscan = off;、このクエリは簡単です)。

ただし、プランナーの構成を変更する前に、このテーブルの統計が正しいかどうかを確認し、必要に応じて再度収集してください。

于 2013-08-08T09:35:43.663 に答える