VACUUM和ANALYZE是PostgreSQL 数据库维护最重要的两个操作。
vacuum用于恢复表中“死元组”占用的空间。删除或更新(删除后插入)记录时,将产生死元组。PostgreSQL不会从表中物理删除旧行,而是在其上放置一个“标记”,以便查询不会返回该行。当vacuum进程运行时,这些死元组占用的空间被标记为可由其他元组重用。
“analyze”顾名思义——它分析数据库表的内容,并收集有关每个表的每一列值分布的统计信息。PostgreSQL 查询引擎使用这些统计信息来查找最佳执行计划。在数据库中插入、删除和更新行时,列统计信息也会更改。analyze——由DBA手动运行,或在auto vacuum后由PostgreSQL自动运行——确保统计数据是最新的。
虽然听起来相对简单,但幕后的vacuum和analyze是两个复杂的过程。幸运的是,DBA不必担心他们的内部结构。但是,他们经常对手动运行这些进程或为配置参数设置最佳值感到困惑。
1 查看autovacuum是否开启
2 查询vacuum/analyze开关
select name,setting,short_desc from pg_settings where name='track_counts'
union all
select name,setting,short_desc from pg_settings where name ='autovacuum';
3 查看/修改autovacuum参数
[root@localhost pgdata]# vi postgresql.conf
4 vacuum/analyze触发条件
--autovacuum触发条件
--autovacuum会做两件事件:一是vacuum,二是analyze。触发条件如下:
--vacuum:autovacuum_vacuum_cost_limit*autovacuum_vacuum_scale_factor + autovacuum_vacuum_threshold
--analyze:autovacuum_analyze_scale_factor* num of tuples per table + autovacuum_analyze_threshold
--例如:test表上有1000条记录,当对这个表进行dml操作达到以下阀值是就会进行autovacuum候选列表,等待执行autovacuum操作。
--vacuum=10000*0.1+50=1050个tuple
--analyze=10000*0.05+50=550个tuple