为什么计划的postgres“扫描索引(btree)”阶段返回所有行?

时间:2019-05-30 12:07:08

标签: postgresql b-tree

我对使用Postgres 9.6的btree有一些误解。

我正在使用SELECT max(total_amount) FROM bookings;

总行数2111110,total_amount-数字(10,2)

我在此列上有索引

CREATE INDEX ON bookings USING btree (total_amount);

当我使用解释时,我看到:

enter image description here

而且我知道Btree是有序树,所以要找到最小键值,您应该从根到尾,从左到右,最大值-右

那么为什么postgres从扫描索引节点中获取所有行而不是所有行?

2 个答案:

答案 0 :(得分:2)

否,它无法获取所有行-如果仔细观察,则会在“仅向后索引”上方有一个Limit步骤-估计只有1行。因此,索引扫描在从索引中检索到的第一行之后停止。

答案 1 :(得分:0)

您发布的是执行计划,数字是估算值,不是真实计数。报告执行计划的方式的一个奇怪之处是,该节点的估计行数假定该节点将运行完成。请注意,其上方的LIMIT节点随后会缩减行估计和成本估计的值,以说明预期它会提前停止的事实。可以将比例报告从LIMIT节点向下推到较低的节点,但这不是已经使用的计费约定。

如果您执行计划的EXPLAIN (ANALYZE),它还会报告实际计数,并且您会看到实际计数为1。这有点令人困惑,因为没有报告估算的计数和实际计数在同一基础上。