การติดตามความคืบหน้าของการสร้างดัชนีใน 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 บล็อกแบบสอบถามนี้ อย่างน้อยก็ทำตอนที่ฉันวิ่งไปที่ 9.6
RonJohn

10

ดังนั้นจึงไม่มีวิธีที่ดีที่จะทำ แต่ถ้าคุณจำเป็นต้องรู้จริง ๆ ... ก่อนอื่นให้คำนวณจำนวนเนื้อที่ที่ดัชนีควรใช้โดยขึ้นอยู่กับขนาดข้อมูล * แถว + ค่าใช้จ่าย จากนั้นคุณสามารถใช้สิ่งต่าง ๆ เช่น pfiles หรือ pgtruss เพื่อค้นหาไฟล์ที่กำลังเขียนภายใน $ PGDATA; หากดัชนีของคุณมีขนาดเกิน 1GB จะเป็นชุดไฟล์เช่น nnnnn.n โดยที่ชุดแรกของ n นั้นสอดคล้องกันและจะเพิ่ม n ครั้งสุดท้ายสำหรับแต่ละไฟล์ GB เมื่อคุณทราบจำนวนไฟล์ที่สร้างขึ้นคุณสามารถดูการเติบโตและดูว่าคุณอยู่ใกล้แค่ไหน ประมาณการคร่าวๆ แต่อาจช่วยได้


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สำหรับรายละเอียด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.