Мониторинг хода построения индекса в PostgreSQL


36

Есть ли способ следить за ходом создания индекса в PostgreSQL. Я создаю индекс для большой таблицы, и я хотел бы видеть, как быстро это происходит.

Есть ли способ контролировать это?


если вы используете psql, попробуйте \ сроки
sftsz

Ответы:


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; если ваши индексы превышают 1 ГБ, это будет серия файлов, таких как nnnnn.n, где первый набор n является последовательным, а последние n увеличиваются для каждого файла в ГБ. Как только вы знаете, сколько файлов создано, вы можете наблюдать за ростом и выяснить, насколько вы близки к завершению. Грубая оценка, но, возможно, это поможет.


4

Нет, даже если вы строите его в режиме CONCURRENT. Хотя в прошлом я следил за размером файла в каталоге базы данных, это не очень полезно, так как вы можете только догадываться, насколько большим он будет.


3

Это станет возможным в следующем выпуске PostgreSQL 12 (должен быть выпущен 3 октября 2019 года).

SELECT 
  now()::TIME(0), 
  a.query, 
  p.phase, 
  p.blocks_total, 
  p.blocks_done, 
  p.tuples_total, 
  p.tuples_done
FROM pg_stat_progress_create_index p 
JOIN pg_stat_activity a ON p.pid = a.pid;

Подробности смотрите в документации по pg_stat_progress_create_index и в блоге depesz .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.