ग्राहक के बाद एक REINDEX आवश्यक है?


12

मैं एक सूचकांक द्वारा एक तालिका को पुनः व्यवस्थित करने के लिए ग्राहक का उपयोग करने पर विचार कर रहा हूं। मैं समझता हूं कि तालिका डेटा का यह मनोरंजन सभी मौजूदा अनुक्रमितों को या तो प्रस्फुटित करता है या बेकार बनाता है। मैंने कुछ संकेत देखे हैं कि एक CLUSTER के बाद REINDEX की आवश्यकता है। मुझे ऐसे अन्य संदर्भ मिले हैं जो दर्शाते हैं कि ग्राहक एक REINDEX करता है। आधिकारिक दस्तावेज पुन: अनुक्रमणिका क्लस्टर का हिस्सा होने या आवश्यक (हालांकि यह क्लस्टर के बाद विश्लेषण चल रहा सुझाव है) के बारे में बिल्कुल कुछ भी नहीं कहते हैं

क्या कोई निश्चित रूप से (अर्थात किसी प्रकार के आधिकारिक डॉक्स के संदर्भ में) कह सकता है कि ग्राहक के बाद REINDEX की आवश्यकता है या नहीं?


2
मुझे नहीं लगता कि यह आवश्यक है। clusterपंक्तियों को स्थानांतरित करता है, इसलिए इसे किसी भी तरह सूचकांक जानकारी को अपडेट करना होगा।
a_horse_with_no_name

हां, लेकिन मैंने जो आधा विचार विमर्श किया है, वह सिद्धांत है, जो सूचकांक को प्रस्फुटित करता है।
TREE

जवाबों:


12

आपको reindex करने की आवश्यकता नहीं है, क्योंकि CLUSTERप्रभावी रूप से यह आपके लिए है।

अधिक विशेष रूप से, CLUSTERस्रोत तालिका को लॉक कर देता है , फिर लक्ष्य सूचकांक के अनुसार आदेशित नई प्रति बनाता है । यह नई प्रति पर अनुक्रमणिका बनाता है फिर पुरानी तालिका और अनुक्रमणिका को नए के साथ बदलता है।

ध्यान दें कि यह VACUUM FULL9.0+ में भी सही है ।

यदि आप चर्चा करते हुए देख रहे हैं कि CLUSTERब्लोट्स इंडेक्स यह लोगों को हो सकता है जो मान रहे हैं कि यह CLUSTERप्री-9.0 की तरह काम करता है VACUUM FULL। आप उन चर्चाओं को भी देख रहे हैं और गलत समझ सकते हैं, जो पुराने VACUUM FULLकार्यान्वयन के कारण होने वाले सूचकांक ब्लोट का उल्लेख करते हैं और विकल्प केCLUSTER रूप में सुझाव देते हैं ।

यह प्रलेखन में निहित है :

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

यह क्या नहीं कहता है, लेकिन क्या यह है कि उन अस्थायी प्रतियां तो मूल तालिका को प्रतिस्थापित करती हैं । (बोल्ड मेरा)।


1
क्या आपके पास कोई संदर्भ है जिसे ग्राहक अनुक्रमित करता है?
TREE

1
@ पहले जोड़ा गया। डॉक्स आपको स्पष्ट रूप से यह नहीं बताते हैं कि अस्थायी तालिका और अनुक्रमित फिर मूल की जगह लेते हैं, लेकिन आप देखेंगे कि यदि आप वास्तव में किसी CLUSTER के पहले या बाद में डेटा निर्देशिका को देखते हैं या यदि आप स्रोत कोड की जांच करते हैं।
क्रेग रिंगर

मैंने इसका परीक्षण किया है, और कम से कम मेरे परीक्षण परिदृश्य में, सूचकांक फ़ाइल का आकार कम हो गया था। लेकिन यह केवल एक परिदृश्य है, और कई चर हो सकते हैं जो व्यवहार को प्रभावित करते हैं (अनुक्रमित की संख्या, डिस्क पर कुल आकार, आदि) इसलिए मैं एक साधारण परीक्षण पर भरोसा नहीं कर सकता।
TREE

1
@TREE सभी संभावित परिस्थितियों में व्यवहार को समझने में पूर्ण निश्चितता के लिए आपको स्रोत कोड को पढ़ना होगा। सभी मैं आपको बता सकता है कि मैं किसी भी स्थिति में जो के बारे में पता नहीं कर रहा हूँ है CLUSTERकरता नहीं अनुक्रमित पुनर्लेखन, और वास्तविक फ़ाइलों की परीक्षा में base/स्पष्ट रूप से नई दिखाएगा relfilenodeरों। ऐसा लगता है कि आप उन समस्याओं के बारे में चिंता कर रहे हैं जो आपके पास अभी तक नहीं हैं।
क्रेग रिंगर

8

मैं इस पर a_horse_with_no_name के साथ हूं: आपको अनुक्रमणिका को फिर से बनाने की आवश्यकता नहीं है। इसके अलावा CLUSTERप्रलेखन में इसका उल्लेख नहीं है, हम आगे REINDEXभी पेज से परामर्श कर सकते हैं:

REINDEX का उपयोग करने के लिए कई परिदृश्य हैं:

  • एक सूचकांक दूषित हो गया है, और अब मान्य डेटा शामिल नहीं है। हालांकि सिद्धांत रूप में ऐसा कभी नहीं होना चाहिए, व्यवहार में अनुक्रमणिका सॉफ़्टवेयर बग्स या हार्डवेयर विफलताओं के कारण दूषित हो सकती है। REINDEX एक पुनर्प्राप्ति विधि प्रदान करता है।

  • एक सूचकांक "फूला हुआ" हो गया है, जिसमें कई खाली या लगभग-खाली पृष्ठ हैं। यह कुछ असामान्य पहुंच पैटर्न के तहत PostgreSQL में बी-ट्री इंडेक्स के साथ हो सकता है। REINDEX इंडेक्स के नए संस्करण को मृत पृष्ठों के बिना लिखकर अंतरिक्ष की खपत को कम करने का एक तरीका प्रदान करता है। अधिक जानकारी के लिए खंड 23.2 देखें।

  • आपने एक इंडेक्स के लिए स्टोरेज पैरामीटर (जैसे फिलफैक्टर) को बदल दिया है, और यह सुनिश्चित करना चाहते हैं कि बदलाव का पूरा असर हो।

  • CONCURRENTLY विकल्प के साथ एक इंडेक्स बिल्ड विफल हो गया, जिससे "अमान्य" इंडेक्स बन गया। इस तरह के सूचकांक बेकार हैं लेकिन उन्हें फिर से बनाने के लिए REINDEX का उपयोग करना सुविधाजनक हो सकता है। ध्यान दें कि REINDEX समवर्ती निर्माण नहीं करेगा। उत्पादन में दखल के बिना सूचकांक का निर्माण करने के लिए आपको सूचकांक को छोड़ना चाहिए और क्रिएट इंडेक्स कॉन्करेन्टली कमांड को फिर से जारी करना चाहिए।

स्पष्ट रूप से, CLUSTERइनमें से किसी भी मामले में नहीं आता है।

और CLUSTERडॉक्स में एक छोटा सा वाक्य है :

[जबकि क्लस्टरिंग] मेज पर प्रत्येक सूचकांक की अस्थायी प्रतियां भी बनाई जाती हैं।

इससे पता चलता है कि तालिका की ही तरह, अनुक्रमणिका को प्रक्रिया के दौरान भी पुन: व्यवस्थित किया जाता है - इस तरह से यह रींडेक्सिंग को बेकार बना देता है।


सुझाव निश्चित रूप से है, और परीक्षण इसकी पुष्टि करता है। मैं इस व्यवहार पर बेहतर भरोसा करना चाहूंगा अगर डॉक्स वास्तव में कहा जाए कि अनुक्रमणिका को फिर से बनाया गया था (स्थायी रूप से)।
TREE

2
मैं यहाँ एक डॉक्टर पैच के लिए सामान देखता हूं। अनुक्रमित अनुक्रमित करने के बारे में मैनुअल अधिक स्पष्ट होना चाहिए।
इरविन ब्रान्डेसटेटर

इस बिंदु पर मेरा संदेह यह है कि देवता इस व्यवहार को आधिकारिक रूप से दस्तावेज नहीं देना चाहते हैं क्योंकि वे स्थायी रूप से इस कार्यान्वयन से बंधे नहीं होना चाहते हैं।
TREE

@ समय के अनुसार संस्करणों और डॉक्स (ज्यादातर) के बीच कई फीचर परिवर्तन होते हैं। संभवतः चश्मा भी बदल जाता है :), इसलिए मुझे कहीं भी कोई टाई नहीं दिख रही है।
डेज़ो

@ डेज़ो ट्रू, लेकिन वे प्रलेखित कार्यक्षमता को हटाने के लिए अनिच्छुक होंगे। सामान्य रूप से प्रलेखन की गुणवत्ता को देखते हुए, मुझे अभी भी लगता है कि इस व्यवहार की चूक जानबूझकर है।
TREE

5

एक संदर्भ मिला, पुनर्प्राप्त डिस्क स्थान अनुभाग में।

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


-3

सभी उत्तरों का विश्लेषण, मेरी राय में ऐसा करने का सही तरीका है कि BEFORE क्लस्टर को फिर से लिखना। जैसा कि दस्तावेज़ीकरण यह नहीं बताता है कि क्लस्टर करते हैं या नहीं, और सूचकांक की केवल एक प्रति, आदेश दिया गया है या नहीं, मुझे लगता है कि अनुक्रमित सूचकांक एक बेहतर संकुल तालिका में परिणाम देगा। उसके बाद एक विश्लेषण काम खत्म कर देगा। सभी से पहले एक वैक्यूम भरा हुआ लगता है, जब तक कि क्लस्टर और / या रींडेक्स मृत टुपल्स को मुक्त नहीं करता है


मैं स्वीकार किए जाते हैं जवाब में उल्लेख के रूप में, प्रलेखन है का कहना है कि अनुक्रमित, बनाया जाएगा बस क्लस्टर आदेश के बारे में पृष्ठ पर नहीं।
TREE

और दोनों CLUSTERऔर VACUUM FULLएक नया भौतिक तालिका पैदा करता है - वहाँ बस नहीं किसी भी मृत के बाद हो सकता है। पुरानी प्रतिलिपि द्वारा उपयोग किए जाने वाले स्थान को ऑपरेशन के अंत तक मुक्त कर दिया जाएगा।
dezso

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