不同RDBMS中提供的不同类型统计功能,查询优化器和查询计划器依赖统计信息选择并生成最佳查询执行计划,因此它非常重要。
PostgreSQL 数据库也管理不同类型的统计,查询优化器依赖它们生成最佳查询执行计划。
1. 为什么统计数据需要更新
假设有一张表有100000行记录,但表统计数据没有更新,仅显示1000个元组信息。
查询优化器总是查看统计表,而从不直接查看实际表文件。
这是,生成的查询执行计划依赖1000行信息,但实际有100000行。
PostgreSQL 数据库有两个统计表:
SELECT *FROM pg_class;
SELECT *FROM pg_stats;
我们可以查询这些表,获取表、索引、页等信息。我们可以查询pg_class表中的reltuples列,把它和实际表中记录数进行对比。如何两者不匹配,那么统计表信息没有更新。
2. 执行维护命令
当你发现统计信息没有更新,可以在数据库或表上执行ANALYZE 命令。执行命令之后,统计表会被更新。
ANALYZE Table_Name;
下面详细介绍常用的维护命令:VACUUM, VACUUM FULL 和 ANALYZE。
VACUUM, VACUUM FULL 和 ANALYZE 是PostgreSQL维护相关的命令,因为PostgreSQL是基于MVCC架构,每个更新或删除会产生删除记录碎片。
2.1 VACUUM
VACUUM 回收已旧版本记录的占用空间。
MCVV 机构中删除的记录不是物理删除,它们在执行VACUUM命令之前仍存储在磁盘上。
如果你频繁在表上执行UPDATE/DELETE操作,则会产生碎片,必须要执行VACUUM命令。VACUUM命令无需表的排他锁。
VACUUM Table_Name;
2.2 VACUUM FULL
通过VACUUM回收的任何空间都可能用于下一次存储。VACUUM FULL 重写整个表及数据并释放旧表占用所有碎片空间。
我们应该避免使用VACUUM FULL,因为它收缩整个表并重写所有表至新磁盘块,需要更多资源和磁盘空间完成整个操作。
如果你发现大量已删除记录,应该在表上执行VACUUM FULL命令。该命令需要表排他锁,同时需要和原表相同大小的剩余空间。语法如下:
VACUUM FULL Table_Name;
2.3 ANALYZE
执行VACUUM 或 VACUUM FULL命令之后, 必须要执行ANALYZE命令更新统计信息。ANALYZE更新所有必须的统计并存储统计结果至pg_statistic系统表中。
查询计划器使用这些统计信息准备有效的查询执行计划。
我们也可以使用VACUUM ANALYZE命令,即首先执行VACUUM 命令,然后再ANALYZE,语法如下:
ANALYZE Table_Name;
VACUUM ANALYZE Table_Name;
3. 总结
本文介绍了PostgreSQL 常用的维护命令VACUUM, VACUUM FULL 和 ANALYZE,结合查询优化如何使用这些命令。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/112030115