-1

我有一个带有多个键的 btree 索引的大表。如果通过固定索引的前两列并在第三列上设置单边边界来进行查询,即使匹配的行数非常少,也会导致查询非常慢。如果我在第三列上设置双边界限,则查询速度会更快。请参阅下面的代码片段。

我希望 postgresql 应该能够快速找到索引列的下限,但在这种情况下似乎不是。

你能解释一下我为什么会遇到这个问题吗?如何解决?

> select min(minute) from data_minutesample where probe_id = 19 and power = 0 and minute between 0 and 22780323;
   min    
----------
 22780262
(1 row)

Time: 28233.498 ms

> select min(minute) from data_minutesample where probe_id = 19 and power = 0 and minute between 22780000 and 22780323;
   min    
----------
 22780262
(1 row)

Time: 13.946 ms

> \d+ data_minutesample
            Table "public.data_minutesample"
[...]
Indexes:
    "data_minutesample_index_unique" UNIQUE, btree (probe_id, power, minute, proto_id, src_port, dst_port, src_addr, dst_addr)
4

1 回答 1

1

尝试添加EXPLAIN到每个查询的开头,以便您可以看到查询计划器如何决定执行它们。

我的猜测是,对于第一个,它决定不使用索引,而是进行表扫描,因为您选择的值范围很大。它可能没有意识到该范围内实际上只有一个匹配值。

您可能会发现,ANALYZE在桌面上运行以确保计划者拥有最新的统计数据将有助于它做出更好的决策。

于 2013-05-26T17:44:22.250 回答