PostgreSQL: COUNT (*) अनुक्रमिक स्कैन का उपयोग करता है, सूचकांक का नहीं


12

PostgreSQL क्रमिक रूप से COUNT(*)क्वेरी के लिए तालिका को स्कैन क्यों करता है , जबकि एक बहुत छोटी और अनुक्रमित प्राथमिक कुंजी है?

जवाबों:


16

आधिकारिक विकी पृष्ठों है कि करने के लिए एक जवाब दे:

[...] यह धीमा होने का कारण PostgreSQL में MVCC कार्यान्वयन से संबंधित है। तथ्य यह है कि कई लेनदेन डेटा के विभिन्न राज्यों को देख सकते हैं, इसका मतलब है कि "COUNT (*)" के लिए पूरे तालिका में डेटा को संक्षेप में प्रस्तुत करने का कोई सीधा रास्ता नहीं हो सकता है; PostgreSQL को कुछ अर्थों में, सभी पंक्तियों के माध्यम से चलना चाहिए। यह आम तौर पर तालिका में हर पंक्ति के बारे में एक क्रमिक स्कैन पढ़ने की जानकारी के परिणामस्वरूप होता है। [...]

इसके अलावा, आप क्वेरी प्लानर के लिए जानकारी के पुनर्निर्माण के लिए एक विश्लेषण की कोशिश कर सकते हैं ।

आपको एक बेहतर प्रदर्शन प्राप्त करना चाहिए, COUNT(an uniquly indexed field)लेकिन अगर यह बहुत बड़ा है, तो एक seq स्कैन ही इसे करने का एकमात्र तरीका है।

यदि आपको बहुत त्वरित संख्याओं की आवश्यकता है और स्कीमा को क्वेरी करने से डरते नहीं हैं, तो आप निम्न कार्य कर सकते हैं

SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass

लेकिन इस मूल्यों पर भरोसा न करें क्योंकि यह तालिका में केवल एक "अनुमानित" (हालांकि अक्सर सटीक) संख्या है।


मुझे नहीं लगता कि यह सही है। मैंने कहीं भी कुछ नहीं पढ़ा है, जहां COUNT(pk)प्रदर्शन में सुधार होगा। मुझे लगता है कि यह हमेशा एक
seq-

1
बिना क्लॉज के आप कहां तक ​​सही हैं, सीक स्कैन किया जाएगा। एक पर्याप्त रूप से चयन के साथ जहां क्लॉज पोस्टग्रैस्कल एक इंडेक्स का उपयोग कर सकता है, लेकिन ध्यान रखें कि यह जिस रिपोर्ट पर रिपोर्ट कर रहा है उसकी दृश्यता को सत्यापित करने के लिए टेबल पर वापस जाना होगा।
स्कॉट मारलोए

अनुमानित पंक्ति गणना प्राप्त करने का एक और तरीका जो मुझे याद रखना आसान लगता है EXPLAIN SELECT * from your_table;। यह क्वेरी निष्पादित नहीं करेगा। आउटपुट में rows=…पंक्तियों की अनुमानित संख्या के साथ शामिल है ।
स्वेन मार्नाच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.