it-swarm.asia

مراقبة تقدم بناء الفهرس في PostgreSQL

هل هناك طريقة لرصد التقدم المحرز في إنشاء فهرس في PostgreSQL. أقوم بإنشاء فهرس على طاولة كبيرة وأود أن أرى مدى سرعة حدوث ذلك.

هل هناك طريقة لرصد هذا؟

40
myahya

وفقًا لـ صيانة فهرس 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 سوف ينمو أثناء بناء الفهرس.

23
databyte

لذلك ، لا توجد طريقة جيدة للقيام بذلك ، ولكن إذا كنت بحاجة حقًا إلى معرفة ... احسب أولاً مقدار المساحة التي يجب أن يأخذها الفهرس ، بناءً على حجم البيانات * الصفوف + النفقات العامة. يمكنك بعد ذلك استخدام شيء مثل pfiles أو pgtruss للعثور على الملفات التي تتم كتابتها داخل $ PGDATA ؛ إذا كانت فهارسك أكبر من 1 غيغابايت ، فستكون سلسلة من الملفات مثل nnnnn.n ، حيث تكون المجموعة الأولى من n متناسقة ، وآخر زيادات n لكل ملف GB. بمجرد معرفة عدد الملفات التي تم إنشاؤها ، يمكنك مشاهدة النمو ومعرفة مدى قربك من الانتهاء. تقدير تقريبي ، ولكن ربما يساعد.

11
xzilla

سيكون ذلك ممكنًا في إصدار 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 للحصول على التفاصيل.

8
Envek

لا ، لا يوجد ، حتى إذا كنت تقوم ببنائه في وضع CONCURRENT. على الرغم من أنني كنت أتابع في الماضي حجم الملف في دليل قاعدة البيانات ، إلا أن هذا ليس مفيدًا حقًا حيث يمكنك فقط تخمين حجمه.

4
araqnid