REINDEX खतरनाक है?


17

मैं कोशिश कर रहा हूं COUNT(*) 150,000 पंक्तियों वाली एक तालिका की जिसमें एक प्राथमिक कुंजी है। यह लगभग 5 मिनट का उपकरण है, इसलिए मुझे लगा कि यह एक अनुक्रमण समस्या है।

PostgreSQL मैनुअल का हवाला देते हुए :

REINDEX सूचकांक की एक बूंद और विश्राम के समान है जिसमें सूचकांक सामग्री को खरोंच से फिर से बनाया गया है। हालांकि, लॉकिंग विचार अलग-अलग हैं। REINDEX लॉक लिखता है, लेकिन इंडेक्स की मूल तालिका नहीं पढ़ता है। यह संसाधित किए जा रहे विशिष्ट इंडेक्स पर एक अनन्य लॉक भी लेता है, जो उस इंडेक्स को उपयोग करने के प्रयास को अवरुद्ध कर देगा (...) बाद में बनाए गए इंडेक्स लॉक लिखता है, लेकिन पढ़ता नहीं है; चूंकि इंडेक्स नहीं है, इसलिए कोई भी रीड इसका उपयोग करने का प्रयास नहीं करेगा, जिसका अर्थ है कि कोई अवरोध नहीं होगा लेकिन रीड को महंगे अनुक्रमिक स्कैन में मजबूर किया जा सकता है।

अपने अनुभव से, क्या आप बता सकते हैं:

  • है REINDEXINGखतरनाक? क्या यह डेटा संगति को नुकसान पहुंचा सकता है?
  • क्या इसमें बहुत समय लग सकता है?
  • क्या यह मेरे परिदृश्य का एक संभावित समाधान है?

अपडेट करें:

हमारे लिए काम करने वाला समाधान एक ही सूचकांक को अलग नाम से फिर से बना रहा था, फिर पुराने सूचकांक को हटा दिया गया।

इंडेक्स निर्माण बहुत तेज़ है, और हमने इंडेक्स का आकार 650 एमबी से घटाकर 8 एमबी कर दिया है। के COUNT(*)साथ प्रयोग करने में betweenकेवल 3 सेकंड लगते हैं।

जवाबों:


15

Reindexing खतरनाक नहीं है और डेटा संगतता को नुकसान नहीं पहुंचा सकता है। हालाँकि, यदि आपके पास महत्वपूर्ण समय है, तो आप डेटा को ढीला कर सकते हैं यदि तालिका लॉक है और डीएमएल निरस्त है।

रिंडेक्सिंग में बहुत समय नहीं लेना चाहिए, लेकिन आमतौर पर पूरे टेबल को पढ़ना, सूचकांक क्षेत्रों को छांटना और एक नया सूचकांक लिखना शामिल होगा। COUNT(*)इसके लिए समय को देखते हुए पांच मिनट या उससे अधिक समय लगेगा।

यह संभावना नहीं है कि यह अनुक्रमण समस्या है। COUNT(*)टेबल स्कैन का उपयोग करना चाहिए जिस स्थिति में कोई सूचकांक नहीं पढ़ा जाता है। मुझे उम्मीद है कि आपको किसी प्रकार की IO समस्या होगी।

इंडेक्स का उपयोग करने की कोशिश कर सकते हैं COUNT(1)या COUNT(pk_field)जो प्रयोग कर सकते हैं।

यदि आप यूनिक्स या लिनक्स प्लेटफॉर्म पर चल रहे हैं, तो आप डिस्क गतिविधि की निगरानी करना चाहते हैं sar। आपके पास एक विफल डिस्क भी हो सकती है जो नाटकीय रूप से IO दरों में कटौती कर सकती है।

COUNT (*) के रिकॉर्ड के निर्माण के लिए बड़ी वस्तुओं के साथ तालिकाओं में भी IO की वृद्धि हो सकती है।


2
Wiki.postgresql.org के अनुसार, COUNT(*)सबसे अच्छा विकल्प है:If you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.
Orange80

1

मुझे आपके लिए सबसे अच्छे उत्तर का यकीन नहीं है। हालाँकि यह सूत्र कुछ अच्छे सुझाव दे रहा है: n http://postgresql.1045698.n5.nabble.com/count-performance-issue-td2067873.html

एक नोट यह है कि आप एक अलग तालिका में पंक्ति गणना बनाए रखने के लिए TRIGGER लागू कर सकते हैं (यदि COUNT (*) को आपके अनुप्रयोगों द्वारा अक्सर कहा जाएगा)।

प्रतिक्रियाओं में से कुछ का सुझाव है कि यह एक डेटाबेस का लक्षण है जिसे हाल ही में पर्याप्त रूप से वैक्यूम नहीं किया गया है (यह सुझाव देते हुए कि ऑटोवैक्यूम आपके सर्वर पर या विशेष रूप से उस डेटाबेस के लिए अक्षम है)?

एक अन्य सुझाव इस प्रकार है:

ANALYZE tablename;
SELECT reltuple FROM pg_class WHERE relname = 'tablename';

और किसी को ए। क्रॉश्चर नोट्स के रूप में पहचाना गया:

नहीं, वर्तमान सूचकांक-कार्यान्वयन में वर्तमान लेनदेन के भीतर पंक्ति-दृश्यता के बारे में कोई जानकारी नहीं है। यदि वर्तमान पंक्ति वर्तमान लेन-देन के भीतर दिखाई देती है तो आपको यह प्राप्त करने के लिए पूरे डेटा-टेबल को स्कैन करना होगा।

... पंक्ति-स्तरीय अनुमतियों के बारे में मेरी टिप्पणी का समर्थन एक प्रदर्शन चिंता का विषय है।

मेरी खोज ने विकीवीएस: माईएससी बनाम पोस्टग्रेक्यूएल: COUNT (*) को भी बदल दिया ।

आप Google द्वारा उपयोग किए गए अन्य परिणामों को मना कर सकते हैं : पोस्टग्रैस्कल काउंट (*) प्रदर्शन

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