小智 32
根据Postgres Wiki 的索引维护页面,您可以通过以下方式了解所有索引的当前状态:
SELECT
t.tablename,
indexname,
c.reltuples AS num_rows,
pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
CASE WHEN indisunique THEN 'Y'
ELSE 'N'
END AS UNIQUE,
idx_scan AS number_of_scans,
idx_tup_read AS tuples_read,
idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
JOIN pg_class c ON c.oid = x.indrelid
JOIN pg_class ipg ON ipg.oid = x.indexrelid
JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
AS foo
ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;
Run Code Online (Sandbox Code Playgroud)
该列num_rows指示您的索引覆盖了多少行,index_size并将随着索引的构建而增长。
Env*_*vek 26
自 PostgreSQL 12 版本(2019 年 10 月 3 日发布)以来,这是可能的。
SELECT
now()::TIME(0),
a.query,
p.phase,
p.blocks_total,
p.blocks_done,
p.tuples_total,
p.tuples_done,
ai.schemaname,
ai.relname,
ai.indexrelname
FROM pg_stat_progress_create_index p
JOIN pg_stat_activity a ON p.pid = a.pid
LEFT JOIN pg_stat_all_indexes ai on ai.relid = p.relid AND ai.indexrelid = p.index_relid;
Run Code Online (Sandbox Code Playgroud)
这可用于检查哪个索引正在根据REINDEX DATABASE命令重建。
有关详细信息,请参阅pg_stat_progress_create_index 视图的文档和depesz 的博客文章。
xzi*_*lla 12
因此,在Postgres 12 之前没有好的方法可以做到这一点,但是如果您真的需要知道......首先根据数据大小 * 行 + 开销计算索引应该占用的空间量。然后,您可以使用 pfiles 或 pgtruss 之类的东西来查找正在写入 $PGDATA 中的文件;如果您的索引超过 1GB,它将是一系列文件,例如 nnnnn.n,其中第一组 n 是一致的,并且每个 GB 文件的最后 n 组递增。一旦您知道创建了多少文件,您就可以观察增长情况并确定您离完成还有多远。粗略估计,但也许有帮助。