为什么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。估计计数和实际计数是有点混淆此处未按相同基础报告。
我对使用 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。估计计数和实际计数是有点混淆此处未按相同基础报告。