如何确定是否需要清空 postgres 数据库?

ams*_*ams 6 postgresql

给定一个 PostgreSQL 数据库,可以使用什么命令来确定数据库是否需要抽真空?

更新我正在与正在评估 postgres 的客户合作,但我不是 DBA,我碰巧对 postgres 比他们更有经验。他们在一个表中有 50 万行的测试中获得了几个小时的更新时间。他们没有对共享缓冲区的 GUCS、work_mem 等进行任何更改,我只是和他们一起完成并让他们这样做。在他们的一些测试中,postgres 报告更新需要 3674 秒,而在 oracle 中需要 2.66 秒,在 MySQL 中需要 33.8 秒。我希望能够回答真空会对他们的测试产生影响的问题,但能够向他们返回有关真空对其测试的影响的真实数据。

CentOS 6 Intel 双处理四核 Xeon K5570 8GB RAM 上的 Postgres 9.2

Cra*_*ger 8

如果您正在调查可能的表/索引膨胀问题,请从 PostgreSQL wiki 上的显示数据库膨胀示例查询开始。

还要检查是否启用了 autovacuum。有些人错误地将其调低或关闭,因为他们看到它会产生负载;他们实际上应该在这些情况下打开它。


小智 7

如果您是数据库的管理员/开发人员,一些症状是当您有巨大的(> 100 万行)表,其中包含定期删除的临时数据(例如删除上个月的条目)并且数据库/表大小不会更改。

我使用这些查询来检查表大小:

/***********************
* DB schema sizes
*************************/
SELECT pg_size_pretty(sum(pg_relation_size(pg_class.oid))::bigint), nspname,
CASE pg_class.relkind WHEN 'r' THEN 'table' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 'v' THEN 'view' WHEN 't' THEN 'toast' ELSE pg_class.relkind::text END
FROM pg_class
LEFT OUTER JOIN pg_namespace ON (pg_namespace.oid = pg_class.relnamespace)
GROUP BY pg_class.relkind, nspname
ORDER BY sum(pg_relation_size(pg_class.oid)) DESC;


/***********************
* DB table sizes
*************************/
SELECT pg_size_pretty(pg_relation_size(pg_class.oid)), pg_class.relname,     pg_namespace.nspname,
CASE pg_class.relkind WHEN 'r' THEN 'table' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 'v' THEN 'view' WHEN 't' THEN 'TOAST' ELSE pg_class.relkind::text END
FROM pg_class 
LEFT OUTER JOIN pg_namespace ON (pg_namespace.oid = pg_class.relnamespace)
ORDER BY pg_relation_size(pg_class.oid) DESC;
Run Code Online (Sandbox Code Playgroud)

这与您的问题并非 100% 相关,但可以为您提供一个开始。


小智 5

没有一个参数可以确定是否需要真空,但是查看 postgres 用于触发自动真空的阈值可能会非常有趣。

详细信息和执行此操作的查询可以在另一个线程中找到:Aggressive Autovacuum on PostgreSQL


fra*_*ncs 2

对于general\xef\xbc\x8c,我们在postgresql.conf\xef\xbc\x8c中打开autovacuum参数,之后数据库会根据需要自动进行vacuum工作。

\n\n

有关 autovaucum 的更多详细信息,请参阅手册的常规吸尘部分

\n\n

我认为没有一个命令可以确定数据库是否需要清理。

\n