PostgreSQL中ANALYZE命令的使用

 更新时间:2025年06月15日 15:03:19   作者:文牧之  
PostgreSQL中ANALYZE用于收集统计信息以优化查询,文中通过示例代码详细的介绍了ANALYZE使用,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

ANALYZE 是 PostgreSQL 中用于收集数据库对象统计信息的关键命令,这些统计信息对于查询优化器生成高效执行计划至关重要。

一 ANALYZE 命令

1.1 基本语法

ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

where option can be one of:

    VERBOSE [ boolean ]
    SKIP_LOCKED [ boolean ]
    BUFFER_USAGE_LIMIT size

and table_and_columns is:

    table_name [ ( column_name [, ...] ) ]

1.2 锁级别

  • 不会锁表(不阻塞 DML 操作)
  • 只获取 ShareUpdateExclusiveLock 锁
    • 允许并发读取和写入
    • 仅阻塞 ALTER TABLEDROP TABLEVACUUM FULL 等DDL操作
  • 并发影响
    • ✅ 允许并发 SELECT/INSERT/UPDATE/DELETE
    • ✅ 允许并发 CREATE INDEX CONCURRENTLY
    • ❌ 阻塞 ALTER TABLE、DROP TABLE、VACUUM FULL

1.3 对索引的影响

当对表执行 ANALYZE 时:

  • 会收集该表所有索引的统计信息
  • 不会重建或修改索引本身
  • 仅更新 pg_statistic 系统目录中的统计信息

二 类似操作的锁对比

命令锁类型是否阻塞DML主要用途
ANALYZEShareUpdateExclusiveLock更新统计信息
REINDEX排他锁重建索引
REINDEX CONCURRENTLYShareUpdateExclusiveLock无锁重建索引
VACUUMShareUpdateExclusiveLock清理死元组
VACUUM FULL排他锁重组表数据

三 使用场景

3.1 常规维护

-- 分析单个表
ANALYZE customers;

-- 分析特定列
ANALYZE customers (customer_id, name);

-- 分析整个数据库
ANALYZE;

3.2 数据大量变更后

-- 批量导入数据后
COPY employees FROM '/path/to/data.csv';
ANALYZE employees;

3.3 性能调优

-- 查询性能下降时
ANALYZE VERBOSE orders;

四 配置参数

自动分析

autovacuum_analyze_scale_factor = 0.1  -- 10%行变化后触发
autovacuum_analyze_threshold = 50      -- 最少50行变化

采样设置

default_statistics_target = 100        -- 统计信息详细程度
alter table large_table set (analyze_sample_percentage = 5); -- 对大表减少采样

五 监控分析状态

查看最后分析时间

SELECT schemaname, relname, last_analyze, analyze_count 
FROM pg_stat_user_tables;

输出示例:

 schemaname |     relname      |         last_analyze          | analyze_count 
------------+------------------+-------------------------------+---------------
 yewu1      | t4               |                               |             0
 yewu1      | t1               | 2025-05-03 18:51:47.366276-07 |             1
 yewu1      | t2               |                               |             0
 public     | pgbench_history  |                               |             0
 yewu1      | test6            |                               |             0
 public     | pgbench_tellers  |                               |             0
 yewu1      | test5            |                               |             0
 public     | pgbench_branches |                               |             0
 yewu1      | test3            |                               |             0
 yewu1      | test2            |                               |             0
 yewu1      | t3               |                               |             0
 public     | pgbench_accounts |                               |             0
 yewu1      | test10           |                               |             0
 yewu1      | test4            |                               |             0
(14 rows)

检查待分析变更量

SELECT schemaname, relname, 
       n_mod_since_analyze,
       n_live_tup,
       round(n_mod_since_analyze*100.0/nullif(n_live_tup,0),2) as mod_percent
FROM pg_stat_user_tables
ORDER BY n_mod_since_analyze DESC;

输出示例:

 schemaname |     relname      | n_mod_since_analyze | n_live_tup | mod_percent 
------------+------------------+---------------------+------------+-------------
 yewu1      | t3               |                 190 |         10 |     1900.00
 yewu1      | test10           |                   4 |          4 |      100.00
 yewu1      | t2               |                   0 |      10000 |        0.00
 public     | pgbench_history  |                   0 |          0 |            
 yewu1      | test6            |                   0 |          0 |            
 public     | pgbench_tellers  |                   0 |          0 |            
 yewu1      | test5            |                   0 |          0 |            
 public     | pgbench_branches |                   0 |          0 |            
 yewu1      | test3            |                   0 |          0 |            
 yewu1      | test2            |                   0 |          0 |            
 public     | pgbench_accounts |                   0 |          0 |            
 yewu1      | t4               |                   0 |      10000 |        0.00
 yewu1      | test4            |                   0 |          0 |            
 yewu1      | t1               |                   0 |          0 |            
(14 rows)

六 性能考虑

资源使用

  • 会消耗CPU和I/O资源
  • 对大表可能耗时较长

最佳实践

  • 在低峰期执行大表分析
  • 对关键表设置更频繁的自动分析
  • 超大表考虑减小采样比例

七 与VACUUM的区别

特性ANALYZEVACUUM
主要目的收集统计信息清理死元组
锁级别ShareUpdateExclusive同左(但VACUUM FULL为排他锁)
是否回收空间是(VACUUM FULL)
更新统计信息可选(ANALYZE选项)

更多详细信息请查看官方文档:https://www.postgresql.org/docs/16/sql-analyze.html

PostgreSQL 中的 ANALYZE 命令不会锁表,是安全的维护操作,可以随时在生产环境执行。如果需要重建索引(而非更新统计信息),则应使用 REINDEX 命令,并注意其锁行为。

到此这篇关于PostgreSQL中ANALYZE命令的使用的文章就介绍到这了,更多相关PostgreSQL ANALYZE内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL查看正在执行的任务并强制结束的操作方法

    PostgreSQL查看正在执行的任务并强制结束的操作方法

    这篇文章主要介绍了PostgreSQL查看正在执行的任务并强制结束的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • PostgreSQL 数据库跨版本升级常用方案解析

    PostgreSQL 数据库跨版本升级常用方案解析

    这篇文章主要介绍了PostgreSQL 数据库跨版本升级常用方案解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • postgres 数据库迁移的几种方法

    postgres 数据库迁移的几种方法

    本文详细介绍了postgres 数据库迁移的几种方法,包括数据文件备份、数据文件迁移方案以及常见问题及其解决方案,感兴趣的可以了解一下
    2025-07-07
  • postgreSQL 非count方法算记录数操作

    postgreSQL 非count方法算记录数操作

    这篇文章主要介绍了postgreSQL 非count方法算记录数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL高级特性与性能优化的实战指南

    PostgreSQL高级特性与性能优化的实战指南

    本文将深入探讨PostgreSQL的高级特性与性能优化技术,结合Python实践,帮助开发者充分发挥PostgreSQL的潜力,文中的示例代码讲解详细,需要的小伙伴可以了解下
    2026-02-02
  • PostgreSQL常用优化技巧示例介绍

    PostgreSQL常用优化技巧示例介绍

    PostgreSQL的SQL优化技巧其实和大多数使用CBO优化器的数据库类似,因此一些常用的SQL优化改写技巧在PostgreSQL也是能够使用的。当然也会有一些不同的地方,今天我们来看看一些在PostgreSQL常用的SQL优化改写技巧
    2022-09-09
  • postgresql13主从搭建Ubuntu

    postgresql13主从搭建Ubuntu

    这篇文章主要为大家介绍了postgresql13主从搭建Ubuntu实现过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Postgresql REGEXP开头的正则函数用法图文详解

    Postgresql REGEXP开头的正则函数用法图文详解

    正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,下面这篇文章主要给大家介绍了关于Postgresql REGEXP开头的正则函数用法的相关资料,需要的朋友可以参考下
    2024-02-02
  • PostgreSQL数据库备份还原全攻略

    PostgreSQL数据库备份还原全攻略

    本文主要介绍逻辑备份和连续归档方式的备份及还原,文件系统级备份由于比较简单,这里不在赘述,以下操作使用的数据库版本为PostgreSQL 12.5,不同的数据库版本在进行连续归档操作时会有细微差异,需要的朋友可以参考下
    2024-04-04
  • PostgreSQL VACUUM 清理机制详解

    PostgreSQL VACUUM 清理机制详解

    本文主要介绍了PostgreSQL VACUUM 清理机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05

最新评论