监视PostgreSQL中索引构建的进度


36

有没有一种方法可以监视PostgreSQL中索引创建的进度。我正在大型表上创建索引,我想看看这种情况发生的速度。

有没有办法监控这一点?


如果使用的是psql,则应尝试\ timing
sftsz 2012年

Answers:


21

根据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;

该列num_rows指示您的索引覆盖了多少行,index_size并将随着索引的建立而增加。


8
我怀疑这可能不适用于索引,在提交创建索引的事务提交之前,该索引可能在目录中不可见。
mustaccio

@mustaccio你是正确的。我正在创建一个需要很长时间的索引,并且上面的命令仅显示已经创建的索引;它不会显示仍在进行“ CREATE INDEX”的索引。
orange80

1
REINDEX TABLE阻止此查询。至少我在9.6上运行时确实如此。
罗恩·约翰

10

因此,没有很好的方法来执行此操作,但是如果您真的需要知道...首先根据数据大小*行+开销计算索引应占用的空间量。然后,您可以使用pfiles或pgtruss之类的东西来查找正在$ PGDATA内写入的文件。如果索引超过1GB,它将是一系列文件,例如nnnnn.n,其中前n个集合是一致的,每个GB文件的后n个增量。一旦知道创建了多少文件,就可以观察增长情况并弄清您即将完成的工作。粗略估计,但这也许有所帮助。


4

不,即使您是在CONCURRENT模式下构建它,也没有。尽管过去我一直关注数据库目录中文件的大小,但这并不是真正有用的,因为您只能猜测它的大小。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.