news 2026/5/13 19:55:50

DeepSeek总结PostgreSQL中统计信息对查询性能的影响

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek总结PostgreSQL中统计信息对查询性能的影响

PostgreSQL中统计信息对查询性能的影响
原文地址:https://boringsql.com/posts/postgresql-statistics/

一、为什么查询会变慢?

  • 查询性能取决于执行计划,而执行计划的质量依赖于统计信息的准确性。
  • 当统计信息过时(如批量数据加载、迁移、快速增长或VACUUM跟不上),规划器会基于错误的数据规模(如预估500行,实际25000行)做出错误决策(如误选Nested Loop),导致性能崩溃。

二、规划器读取的两个核心元数据来源

  1. pg_class(表级统计)

    • relpages:表占用的磁盘页数(影响顺序扫描成本)。
    • reltuples:估计的活跃行数(影响连接、聚合等操作的估算)。
    • relallvisible:可见性映射页数(影响仅索引扫描)。
    • 注意:这些值是由ANALYZE估算的,不是实时计数。
  2. pg_statistic(通过视图pg_stats查看,列级统计)

    • null_frac:NULL值比例。
    • avg_width:平均字节宽度。
    • n_distinct:唯一值数量。
    • most_common_vals(MCV)和most_common_freqs:最常见值及其频率。
    • histogram_bounds:直方图边界(用于范围查询)。
    • correlation:物理存储顺序与逻辑顺序的相关性(影响索引扫描成本)。

三、选择率(Selectivity)如何估算行数

  • 公式:估算行数 = 总行数 × 选择率。
  • 等值查询(=):优先查MCV列表匹配频率;若不在列表中,则假设均匀分布在剩余数据中。
  • 范围查询(>, <):利用histogram_bounds,计算查询覆盖的桶数比例(假设数据在桶内线性分布)。
  • 模式匹配(LIKE)
    • 对于'%middle%'这类无前缀匹配,规划器只能使用硬编码的默认选择率(0.5%)。
    • 对于'prefix%'这类有前缀匹配,可降级为范围查询利用直方图,精度较高。
  • 连接估算:依赖n_distinct,公式为(左表行数 × 右表行数) / max(左表唯一值, 右表唯一值)

四、当没有统计信息时(回退默认值)

在没有统计信息(如新表、未运行ANALYZE)或特定场景下,PostgreSQL会使用硬编码默认值:

  • 等号、BETWEEN、LIKE、IS NULL:默认选择率0.5%
  • 不等号(>, <):默认选择率33.3%
  • IS NOT NULL:默认选择率99.5%

无统计信息的常见陷阱

  • CTE和子查询(未被物化时)。
  • 临时表(autovacuum不处理)。
  • 外部表。
  • WHERE子句中的计算表达式(如WHERE amount * 1.1 > 500),除非创建表达式索引或扩展统计。

五、ANALYZE是如何工作的

  • 采样机制:ANALYZE并非读取全表,而是基于default_statistics_target(默认100)进行采样。
    • 采样行数 = 300 ×default_statistics_target= 30,000行。
    • 对于大表,采样比例会非常小(如5000万行表只采0.06%)。
  • 计算过程
    1. 随机选择一批页面,读取其中所有活跃行。
    2. 计算NULL比例、平均宽度。
    3. 排序并构建MCV列表(高频值)和直方图(剩余值均匀分桶)。
    4. 计算相关性。
  • 写入:结果写入pg_statistic,并更新pg_class中的relpages/reltuples

六、如何控制统计质量

  1. 调整default_statistics_target
    • 提高目标值可增加MCV数量、直方图精度和采样行数,但会消耗更多存储和规划时间。
    • 可以针对特定列设置:ALTER TABLE orders ALTER COLUMN status SET STATISTICS 500;
  2. 使用扩展统计
    • 解决列之间的相关性(如城市=‘ Edinburgh’和国家=‘UK’),防止规划器独立估算导致严重偏差。
    • 类型包括:dependencies(函数依赖)、ndistinct(组合唯一值)、mcv(组合最常见值)。
    • 创建方法:CREATE STATISTICS ... ON (列1, 列2) FROM 表;

七、诊断与总结

  • 当查询慢时,首先使用EXPLAIN ANALYZE对比预估行数和实际行数。
  • 如果偏差超过10倍,通常意味着统计信息不准。
  • 解决路径:运行ANALYZE-> 调整特定列的统计目标 -> 针对多列创建扩展统计。
  • 核心结论:规划器的决策质量完全取决于读取的统计信息。当估算错误时,不要责怪规划器,而应检查它所依据的数据是否准确。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 19:55:50

在仅有runtime的Docker镜像中使用dotnet global tool的方法

Docker镜像中使用dotnet global tool△ 背景和问题概述.NET Core 自2.1版本起便支持了Global tool特性。通过这一特性&#xff0c;用户能够借助命令行轻松实现众多功能&#xff0c;而微软提供的dotnet诊断工具系列也均以global tool形式呈现&#xff0c;使得使用过程更为便捷。…

作者头像 李华
网站建设 2026/4/18 20:30:37

卢森堡大学突破:AI实现人类式持续学习防遗忘

当你学会骑自行车后&#xff0c;即使多年不骑也不会忘记&#xff0c;但同时你还能继续学习开汽车。然而&#xff0c;对于人工智能来说&#xff0c;学习新技能往往意味着忘记旧技能&#xff0c;就像一个只有一间房的仓库&#xff0c;每次放入新东西就必须丢掉旧的。这种现象被称…

作者头像 李华
网站建设 2026/4/18 20:30:37

【2025最新】基于SpringBoot+Vue的HTML语言环保网站管理系统源码+MyBatis+MySQL

摘要 随着全球环境问题的日益严峻&#xff0c;环保意识的提升成为社会发展的关键议题。互联网技术的快速发展为环保信息的传播和管理提供了高效便捷的途径。环保网站管理系统作为信息传播的重要载体&#xff0c;能够整合环保新闻、政策法规、公益活动等内容&#xff0c;帮助公众…

作者头像 李华
网站建设 2026/4/18 20:30:38

给定一个字符串,求其最长无重复子串

从"找不同"到"算最优":一文搞懂最长无重复子串问题的前世今生 关键词:字符串处理、滑动窗口算法、哈希表优化、时间复杂度分析、LeetCode经典题、双指针技术、空间换时间策略 摘要:在字符串的世界里,“最长无重复子串"就像一位隐藏的宝藏猎人——…

作者头像 李华