在多列上使用btree进行postgresql查询优化

时间:2013-05-26 17:11:02

标签: postgresql query-optimization b-tree

我有一个大表,多个键上有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)

1 个答案:

答案 0 :(得分:1)

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

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

您可能会发现在桌面上运行ANALYZE以确保规划人员拥有最新的统计信息有助于他们做出更好的决策。