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
相关产品推荐
相关产品推荐

