为什么postgres "scan index(btree)" phase of plan returns all rows?

Why postgres "scan index(btree)" phase of plan returns all rows?

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

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

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

我有这个专栏的索引

CREATE INDEX ON bookings USING btree (total_amount);

当我使用 explain 时,我看到:

据我所知,Btree 是有序树,因此要找到最小键值,您应该从根到尾向左,最大 - 向右

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

不,它没有获取所有行 - 如果您仔细观察,在 Index Only Scan Backwards 正上方有一个 Limit 步骤 - 估计只有 1 行。因此索引扫描在从索引中检索到的第一行之后停止。

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

如果你执行计划的EXPLAIN (ANALYZE),它也会报告实际计数,你会看到实际计数是 1。估计计数和实际计数是有点混淆此处未按相同基础报告。