PostgreSQL – 查询以确定哪些表当前正在被清理?

前端之家收集整理的这篇文章主要介绍了PostgreSQL – 查询以确定哪些表当前正在被清理?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我找到了一个查询来查看真空吸尘器运行的时间,但不是当前正在运行的真空吸尘器. ( http://heatware.net/databases/postgres-tables-auto-vacuum-analyze/)

有没有要完成此任务的查询?我知道我可以点击pg_stat_activity,但是有些真空吸尘器没有表名,而是有pg_toast.pg_toast_3621837,所以这在100%的时间都不会起作用.

使用系统目录可以轻松解决此问题.我建议加入pg_locks,因为autovacuum在它正在处理的表上获取ShareUpdateExclusiveLock锁,以避免从pg_stat_activity手动解析查询.

以下查询列出了正在自动清理的表,如果要清理toast表,则解决pg_toast引用,如@Zeki链接Postgres pg_toast in autovacuum – which table?问题中所述.

SELECT n.nspname || '.' || c.relname
    FROM pg_namespace n,pg_stat_activity a,pg_locks l,pg_class c
    WHERE
        a.query LIKE 'autovacuum: %'
        AND l.pid = a.pid
        AND l.mode = 'ShareUpdateExclusiveLock'
        AND (c.oid = l.relation OR c.reltoastrelid = l.relation)
        AND n.oid = c.relnamespace
        AND n.nspname <> 'pg_toast';

请注意,虽然pg_stat_activity和pg_locks目录在数据库之间共享,但此查询仅列出当前数据库自动清理的表,因为pg_relation不是共享目录.

猜你在找的Postgre SQL相关文章