पोस्टग्रुप VACUUM FULL और CLUSTER के बीच अंतर


13

मेरे पास डेटा के साथ कब्जे में 200 जीबी और उस पर 6 इंडेक्स द्वारा 180 जीबी आकार के साथ एक टेबल है। यह 30% फूला हुआ है, इसलिए मैं इसके कब्जे वाले अवांछित स्थान को पुनः प्राप्त करना चाहता हूं। इसे job_id_idx इंडेक्स पर क्लस्टर किया जाता है ।

तो अंतरिक्ष को पुनः प्राप्त करने के लिए मुझे clusterकमांड या vacuum fullकमांड का उपयोग करने की आवश्यकता है ?

  1. इस दो कमांड के बीच क्या अंतर है?

  2. क्या vacuum fullआदेश के समान कुछ कॉलम द्वारा clusterआदेश दिया गया है?

  3. क्या इंडेक्स को दोनों कमांड में फिर से बनाया गया है?

  4. मेरे मामले में कौन सा तेज होगा?

PostgreSQL डेटाबेस का संस्करण 9.1 है


1
हां, अनुक्रमणिका को फिर से बनाया जाएगा। जो तेजी से कुछ चीजों पर निर्भर करता है, मैं कल्पना करता हूं। लेकिन एक बात निश्चित है: 'कुछ कॉलम द्वारा वैक्यूम फुल ऑर्डर' जैसा कुछ नहीं है।
dezso

1
मुझे यह भी बताना चाहिए कि VACUUM एक लेनदेन के अंदर नहीं चल सकता है जो कई मामलों में ग्राहक को बेहतर परिणाम देता है (और कभी-कभी एकमात्र विकल्प) जो समान परिणाम उत्पन्न करता है।
oᴉɹǝɥɔ

जवाबों:


8

क्या CLUSTERकरता है, यह जांचने के लिए , मैंने पहले के एक प्रयोग से एक तालिका ली जिसमें मूल रूप से पहले 10 मिलियन सकारात्मक पूर्णांक शामिल थे। मैंने पहले ही कुछ पंक्तियों को हटा दिया है और एक अन्य कॉलम भी है लेकिन ये केवल वास्तविक तालिका आकार को प्रभावित करते हैं, इसलिए यह उतना दिलचस्प नहीं है।

सबसे पहले, VACUUM FULLमेज पर भागते हुए fka, मैंने इसका आकार लिया:

\dt+ fka
                    List of relations
 Schema | Name | Type  |  Owner   |  Size  | Description 
--------+------+-------+----------+--------+-------------
 public | fka  | table | test     | 338 MB | 

फिर तालिका के आरंभ से ही डेटा का भौतिक क्रम देखते हैं:

SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;

 id  | col1 |  ctid   
-----+------+---------
   2 | 2    | (0,1)
   3 | 3    | (0,2)
   4 | 4    | (0,3)
   5 | 5    | (0,4)
   6 | 6    | (0,5)

अब कुछ पंक्तियों को हटाते हैं:

DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000

इसके बाद, रिपोर्ट तालिका का आकार नहीं बदला। तो चलिए अब देखते हैं क्या CLUSTERकरता है:

CLUSTER fka USING fka_pkey;

SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;

 id  | col1 |  ctid   
-----+------+---------
   2 | 2    | (0,1)
   3 | 3    | (0,2)
   4 | 4    | (0,3)
   6 | 6    | (0,4)
   7 | 7    | (0,5)

ऑपरेशन के बाद टेबल का आकार 338 से 296 एमबी में बदल गया। से ctidस्तंभ, जो पेज में टपल के भौतिक स्थान का वर्णन करता है, आप भी देख कोई अंतर जहां पंक्ति मिलान है कि वहाँ id = 5हुआ करता था।

जैसा कि ट्यूपल्स को फिर से व्यवस्थित किया गया था, अनुक्रमित को फिर से बनाया जाना चाहिए था ताकि वे सही स्थानों की ओर इशारा करें।

तो अंतर ऐसा प्रतीत होता है जो VACUUM FULLपंक्तियों को आदेश नहीं देता है। जहाँ तक मुझे पता है, तंत्र में कुछ अंतर है जिसका उपयोग दो कमांड करते हैं लेकिन व्यावहारिक दृष्टिकोण से यह मुख्य (केवल) अंतर प्रतीत होता है।


मुझे यकीन नहीं था कि ctidस्तंभ क्या है। यह तालिका के भीतर पंक्ति के भौतिक स्थान का वर्णन करने वाला एक सिस्टम कॉलम है। postgresql.org/docs/current/ddl-system-columns.html
गजस

8

VACUUM FULLबिना किसी अतिरिक्त स्थान के साथ एक नई डिस्क फ़ाइल में तालिका की संपूर्ण सामग्री को फिर से लिखता है, अप्रयुक्त स्थान को ऑपरेटिंग सिस्टम में वापस करने की अनुमति देता है। इस विधि में अतिरिक्त डिस्क स्थान की भी आवश्यकता होती है, क्योंकि यह तालिका की एक नई प्रति लिखता है और जब तक ऑपरेशन पूरा नहीं होता तब तक पुरानी प्रति जारी नहीं करता है। आमतौर पर इसका उपयोग केवल तब किया जाना चाहिए जब तालिका के भीतर से एक महत्वपूर्ण मात्रा में जगह की आवश्यकता हो।

http://www.postgresql.org/docs/9.1/static/sql-vacuum.html

CLUSTERIndex_name द्वारा निर्दिष्ट सूचकांक के आधार पर Table_name द्वारा निर्दिष्ट तालिका को क्लस्टर करने के लिए PostgreSQL को निर्देश देता है। सूचकांक को पहले से ही table_name पर परिभाषित किया जाना चाहिए। जब किसी तालिका को क्लस्टर किया जाता है, तो यह इंडेक्स जानकारी के आधार पर भौतिक रूप से पुन: व्यवस्थित होता है और उस पर ACCESS EXCLUSIVE लॉक प्राप्त होता है।

http://www.postgresql.org/docs/9.1/static/sql-cluster.html

intresting भी: एक- reindex- आवश्यक-के बाद क्लस्टर है

लेकिन शायद आप सभी की जरूरत एक सरल है REINDEXजो सूचकांक की तालिका में संग्रहीत डेटा का उपयोग करके एक सूचकांक का पुनर्निर्माण करता है, जो सूचकांक की पुरानी प्रति को प्रतिस्थापित करता है।

http://www.postgresql.org/docs/9.1/static/sql-reindex.html


1
ओह! REINDEX के बारे में भी अच्छी टिप! मैं दोनों VACUUM और ग्राहक द्वारा कुछ तालिकाओं को सिकोड़ रहा हूं (इसे करने के लिए समय और प्रभावों की तुलना करने की कोशिश कर रहा हूं) और अब मेरी सबसे बड़ी वस्तु वास्तव में सूचकांक हैं।
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.