PostgreSQL में सूचकांक निर्माण की निगरानी प्रगति


36

क्या PostgreSQL में एक सूचकांक के निर्माण की प्रगति की निगरानी करने का एक तरीका है। मैं एक बड़ी टेबल पर एक इंडेक्स बना रहा हूं और मैं यह देखना चाहूंगा कि यह कितनी तेजी से हो रहा है।

क्या इसकी निगरानी करने का कोई तरीका है?


यदि आप psql का उपयोग कर रहे हैं, तो आपको \
sftsz

जवाबों:


21

के अनुसार Postgres विकी के इंडेक्स रखरखाव पेज, आप के साथ अपने सभी अनुक्रमित की वर्तमान स्थिति पता कर सकते हैं:

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 टेबल इस क्वेरी को ब्लॉक करता है। कम से कम, यह तब हुआ जब मैंने इसे 9.6 पर चलाया।
रॉनजॉन

10

इसलिए, इसे करने का कोई अच्छा तरीका नहीं है, लेकिन अगर आपको वास्तव में जानने की आवश्यकता है ... तो सबसे पहले डेटा आकार * पंक्तियों + ओवरहेड के आधार पर सूचकांक की मात्रा की गणना करें। फिर आप उन फ़ाइलों को खोजने के लिए pfiles या pgtruss जैसी किसी चीज़ का उपयोग कर सकते हैं जो $ PGDATA के अंदर लिखी जा रही हैं; यदि आपके अनुक्रमित 1GB से अधिक हैं, तो यह nnnnn.n जैसी फ़ाइलों की एक श्रृंखला होगी, जहां n का पहला सेट सुसंगत है, और प्रत्येक GB फ़ाइल के लिए अंतिम n वेतन वृद्धि। एक बार जब आप जानते हैं कि कितनी फाइलें बनाई गई हैं, तो आप विकास देख सकते हैं और यह पता लगा सकते हैं कि आप परिष्करण के कितने करीब हैं। किसी न किसी का अनुमान है, लेकिन शायद यह मदद करता है।


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 दृश्य और डेसज़ के ब्लॉग पोस्ट के लिए डॉक्स देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.