给定一个 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
小智 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。
归档时间: |
|
查看次数: |
8183 次 |
最近记录: |