Моніторинг ходу побудови індексу в PostgreSQL


36

Чи є спосіб стежити за ходом створення індексу в PostgreSQL. Я створюю індекс на великій таблиці і хотів би побачити, наскільки швидко це відбувається.

Чи є спосіб це відстежити?


якщо ви використовуєте psql, спробуйте \ timing
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 ви праві. я створюю індекс, який займає тривалий час, і вищевказана команда показує лише індекси, які вже створені; він не відображатиме індекси, де "CREATE INDEX" все ще працює.
помаранчевий80

1
REINDEX TABLE блокує цей запит. Принаймні, це було, коли я пробіг його 9,6.
RonJohn

10

Отже, немає хорошого способу це зробити, але якщо вам дійсно потрібно знати ... спочатку обчисліть кількість місця, яке має зайняти індекс, виходячи з розміру даних * рядки + накладні витрати. Потім ви можете використовувати щось на зразок pfiles або pgtruss, щоб знайти файли, що записуються всередині $ PGDATA; якщо ваші індекси перевищують 1 Гб, це буде серія файлів на зразок nnnnn.n, де перший набір n є послідовним, а останній n збільшенням для кожного файлу GB. Як тільки ви дізнаєтеся, скільки файлів створено, ви можете спостерігати за зростанням і зрозуміти, наскільки ви готові до завершення. Приблизна оцінка, але, можливо, це допомагає.


4

Ні, цього немає, навіть якщо ви будуєте його в СУЧАСНОМУ режимі. Хоча в минулому я постійно спостерігав за розміром файлу в каталозі бази даних, це не дуже корисно, оскільки ви можете лише здогадуватися, який він буде великим.


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.