我在 Debian GNU/Linux 服务器上运行的 PostgreSQL 12.7 数据库中有一个大表(我们称之为big_table
)。这台机器有8 GB的 RAM 和4 个 CPU 核心,并且主要专用于这个 PostgreSQL 服务器。
目前这big_table
有大约1.03 亿行保存时间序列数据(例如,数据不更新,只插入或删除)。几乎每个月,我都会从这个表中删除大约25到3000 万行。那些被删除的行对应于一个连续的时间范围(例如“DELETE ... between 1-Mar and 30-Mar”)。这些DELETE
操作需要 10 分钟到 30 分钟才能完成。这种使用模式的有效期为6个多月。
表大小约为46 GB,该表的索引加起来约为61 GB。
有一个应用程序每隔几秒就向 this 插入 10 行big_table
,另一个面向用户的 Web 应用程序从这个表中读取数据以绘制一些最近的值。
每次我运行DELETE
删除 25 到 30 百万行的操作时(在月底),我都会看到AUTOVACUUM启动并开始工作。
我想检查一些关于这些 AUTOVACUUM 如何在该数据库中运行以下 SQL 查询的统计信息:
SELECT relname, last_vacuum, vacuum_count, autovacuum_count, last_autovacuum, autoanalyze_count, last_autoanalyze
FROM pg_stat_user_tables
WHERE relname = 'big_table' ;
令我惊讶的是,它给出了以下结果:
|relname |last_vacuum|vacuum_count|autovacuum_count|last_autovacuum|autoanalyze_count|last_autoanalyze|
|------------|-----------|------------|----------------|---------------|-----------------|----------------|
|big_Table | |0 |0 | |0 | |
我试图了解以下内容:
- 为什么都是
autovacuum_count
和auto_analyzecount
零? - 为什么是
last_autovacuum
和last_autoanalyze
NULL?
不幸的是, https: //www.postgresql.org/docs/12/monitoring-stats.html 上的官方文档对我没有太大帮助。
- 会不会是AUTOVACUUM启动但无法完成的情况?ANALYZE 也类似?
- 如果是这样,根本原因可能是什么?
- 我应该检查什么来验证常规吸尘是否能达到预期的效果?
如果数据库曾经被不干净地关闭,所有的统计信息都会被重置。您可以检查 pg_stat_database。或者可以为数据库或单个表手动重置它们。
是的,但是日志文件中应该有关于它的消息。
例如,如果您经常执行诸如重新启动数据库或创建或删除索引之类的操作,这将中断自动清理,如果您经常执行这些操作,那么自动清理可能永远无法完成。