次の列に複数列の b ツリー インデックスを持つ非常に単純な db スキーマがあります。
PersonId, Amount, Commission
ここで、次のクエリでテーブルを選択しようとすると:
explain select * from "Order" where "PersonId" = 2 AND "Commission" > 3
Pg はインデックスをスキャンしており、クエリは非常に高速ですが、次のクエリを試してみると:
explain select * from "Order" where "PersonId" > 2 AND "Commission" > 3
インデックスが存在する場合でも、順次スキャンを実行します。このクエでも
explain select * from "Order" where "Commission" > 3
順次スキャンを行います。理由を説明したい人はいますか?:-)
どうもありがとうございました。
アップデート
テーブルには 1 億行が含まれています。MS SQL に対する PostgreSQL のパフォーマンスをテストするためだけに作成しました。テーブルはすでに VACUUMED です。Core I5 2500k クアッド コア CPU と 8 GB の RAM を実行しています。
このクエリの Explain Analyze の結果は次のとおりです。
explain ANALYZE select * from "Order" where "Commission" BETWEEN 3000000 AND 3000010 LIMIT 20
Limit (cost=0.00..2218328.00 rows=1 width=24) (actual time=28043.249..28043.249 rows=0 loops=1)
-> Seq Scan on "Order" (cost=0.00..2218328.00 rows=1 width=24) (actual time=28043.247..28043.247 rows=0 loops=1)
Filter: (("Commission" >= 3000000::numeric) AND ("Commission" <= 3000010::numeric))
Total runtime: 28043.278 ms