You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL执行计划中id<10过滤为何预估行数为12?

PostgreSQL查询优化器如何预估出rows=12?

用户执行了以下查询的EXPLAIN命令:

EXPLAIN
SELECT * FROM project_project WHERE id < 10 FOR UPDATE;

得到的执行计划输出:

"LockRows  (cost=0.00..6.57 rows=12 width=18305)"
"  ->  Seq Scan on project_project  (cost=0.00..6.45 rows=12 width=18305)"
"        Filter: (id < 10)"

查询优化器预估出rows=12的核心逻辑基于表的统计信息,具体过程如下:

  • 依赖ANALYZE生成的统计数据:PostgreSQL会通过ANALYZE命令收集表和列的统计信息,包括project_project表的总行数、id列的最小值、最大值、数据分布直方图等,这些是估算的基础。
  • 直方图匹配计算:如果id列有生成直方图,优化器会定位直方图中符合id < 10的区间,计算这些区间对应的行数占总行数的比例,再乘以总行数得到预估结果。比如总行数若为X,直方图显示小于10的行占比约为12/X,就会得出rows=12。
  • 均匀分布假设(无直方图时):如果id列没有直方图(比如表数据量极小,ANALYZE未生成),优化器会默认数据是均匀分布的。假设id的最小值远小于10、最大值远大于10,就会用公式(10 - 最小值) / (最大值 - 最小值) * 总行数来估算,结果恰好接近12。
  • 小表的统计特性:如果project_project是小表,优化器对统计信息的依赖更直接,即使是近似估算也容易得到接近实际的行数。

内容的提问来源于stack exchange,提问作者Azima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:59:57