例行维护表
为了保证数据库的有效运行,数据库必须在插入/删除操作后,基于客户场景,定期做VACUUM FULL
和ANALYZE
,更新统计信息,以便获得更优的性能。
相关概念
使用VACUUM、VACUUM FULL和ANALYZE命令定期对每个表进行维护,主要有以下原因:
- VACUUM对每个表维护了一个可视化映射来跟踪包含对别的活动事务可见的数组的页。一个普通的索引扫描首先通过可视化映射来获取对应的数组,来检查是否对当前事务可见。若无法获取,再通过堆数组抓取的方式来检查。因此更新表的可视化映射,可加速唯一索引扫描。
- VACUUM可避免执行的事务数超过数据库阈值时,事务ID重叠造成的原有数据丢失。
- VACUUM FULL可回收已更新或已删除的数据所占据的磁盘空间,同时将小数据文件合并。
- ANALYZE可收集与数据库中表内容相关的统计信息。统计结果存储在系统表PG_STATISTIC中。查询优化器会使用这些统计数据,生成最有效的执行计划。
操作步骤
1、创建RANGE范围分区表table_p1。
create table table_p1
(id int,
name varchar(100))
partition by range(id)(
partition p1 values less than (10),
partition p2 values less than (20),
partition p3 values less than (30),
partition p4 values less than (40),
partition p5 values less than (50),
partition p6 values less than (MAXVALUE)
)
ENABLE ROW MOVEMENT;
2、使用VACUUM或VACUUM FULL命令,进行磁盘空间回收。
VACUUM
对表执行VACUUM操作
VACUUM table_p1;
可以与数据库操作命令并行运行。(执行期间,可正常使用的语句:SELECT、INSERT、UPDATE和DELETE。不可正常使用的语句:ALTER TABLE)。
对表分区执行VACUUM操作
vacuum table_p1 partition(p1);
VACUUM FULL
VACUUM FULL table_p1;
需要向正在执行的表增加排他锁,且需要停止其他所有数据库操作。
3、使用ANALYZE语句更新统计信息。
ANALYZE table_p1;
使用ANALYZE VERBOSE
语句更新统计信息,并输出表的相关信息。
ANALYZE VERBOSE table_p1;
输出结果为:
INFO: analyzing "public.table_p1"(node1 pid=6687)
ANALYZE
也可以同时执行VACUUM ANALYZE命令进行查询优化。
VACUUM ANALYZE table_p1;