我有一个非常简单的数据库模式,它在以下列上有一个多列 b 树索引:
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 亿行。我创建它只是为了测试 PostgreSQL 针对 MS SQL 的性能。该表已经 VACUUMED。我正在运行 Core I5 2500k 四核 cpu 和 8 GB 内存。
这是该查询的解释分析结果:
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