มีวิธีการติดตามความคืบหน้าของการสร้างดัชนีใน PostgreSQL หรือไม่ ฉันกำลังสร้างดัชนีบนโต๊ะขนาดใหญ่และฉันต้องการที่จะดูว่าสิ่งนี้เกิดขึ้นเร็วแค่ไหน
มีวิธีตรวจสอบเรื่องนี้หรือไม่?
มีวิธีการติดตามความคืบหน้าของการสร้างดัชนีใน PostgreSQL หรือไม่ ฉันกำลังสร้างดัชนีบนโต๊ะขนาดใหญ่และฉันต้องการที่จะดูว่าสิ่งนี้เกิดขึ้นเร็วแค่ไหน
มีวิธีตรวจสอบเรื่องนี้หรือไม่?
คำตอบ:
ตามหน้าดัชนีการบำรุงรักษาของ 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
จะเพิ่มขึ้นเมื่อดัชนีถูกสร้างขึ้น
ดังนั้นจึงไม่มีวิธีที่ดีที่จะทำ แต่ถ้าคุณจำเป็นต้องรู้จริง ๆ ... ก่อนอื่นให้คำนวณจำนวนเนื้อที่ที่ดัชนีควรใช้โดยขึ้นอยู่กับขนาดข้อมูล * แถว + ค่าใช้จ่าย จากนั้นคุณสามารถใช้สิ่งต่าง ๆ เช่น pfiles หรือ pgtruss เพื่อค้นหาไฟล์ที่กำลังเขียนภายใน $ PGDATA; หากดัชนีของคุณมีขนาดเกิน 1GB จะเป็นชุดไฟล์เช่น nnnnn.n โดยที่ชุดแรกของ n นั้นสอดคล้องกันและจะเพิ่ม n ครั้งสุดท้ายสำหรับแต่ละไฟล์ GB เมื่อคุณทราบจำนวนไฟล์ที่สร้างขึ้นคุณสามารถดูการเติบโตและดูว่าคุณอยู่ใกล้แค่ไหน ประมาณการคร่าวๆ แต่อาจช่วยได้
ไม่ไม่มีแม้ว่าคุณจะสร้างมันในโหมด CONCURRENT แม้ว่าในอดีตที่ผ่านมาฉันจะต้องพิจารณาขนาดของไฟล์ในไดเรกทอรีฐานข้อมูล แต่ก็ไม่ได้มีประโยชน์มากนักเพราะคุณสามารถเดาได้ว่ามันจะมีขนาดใหญ่แค่ไหน
มันจะเป็นไปได้ในการปล่อย 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สำหรับรายละเอียด