पोस्टग्रैज: काउंट (*) बनाम काउंट (आईडी)


11

मैंने दस्तावेज़ीकरण में count(*)और के बीच का अंतर देखा count(pk)। मैं उपयोग कर रहा था count(pk)(जहां pkएक है SERIAL PRIMARY KEY) के अस्तित्व के बारे में पता नहीं है count(*)

मेरा प्रश्न पोस्टग्रेज की आंतरिक अनुकूलन के बारे में है। क्या यह लेने के लिए काफी स्मार्ट है कि SERIAL PRIMARY KEYहर पंक्ति में एक मौजूद है और कभी भी गलत नहीं होगा और सिर्फ पंक्तियों को गिनना होगा या क्या यह प्रत्येक पंक्ति के लिए निरर्थक जांचों को निरर्थक करेगा? मैं मानता हूँ कि यह शायद एक व्यर्थ अनुकूलन का बहुत अधिक है, लेकिन मैं बस उत्सुक हूँ।

मैं के उत्पादन पर एक दृष्टि डाली EXPLAINऔर EXPLAIN VERBOSEके लिए count(*), count(id)और count(id > 50)यह देखने के लिए EXPLAINइसके उत्पादन में विधेय जाँच उल्लेख किया है। यह नहीं है

जवाबों:


15

पिछले वर्षों में विभिन्न संस्करणों के साथ मेरे बार-बार किए गए परीक्षणों में मुझे लगातार परिणाम मिला है:
count(*)की तुलना में थोड़ा तेज है count(pk)। यह छोटा भी है और ज्यादातर समय यह बेहतर होता है कि क्या परीक्षण किया जाता है: एक पंक्ति का अस्तित्व।

के विषय में:

क्या पोस्टग्रेज काफी स्मार्ट SERIAL PRIMARY KEYहै जो हर पंक्ति में मौजूद है और कभी भी गलत नहीं होगा

एकमात्र प्रासंगिक चीज NOT NULLबाधा है। PRIMARY KEYहै NOT NULLस्वचालित रूप से, serialया never falseप्रश्न के लिए ओर्थोगोनल हैं।

साथ count(col), अगर PostgreSQL स्मार्ट हो सकता है और प्रणाली सूची एक स्तंभ था कि क्या जांच करने के लिए कोशिश कर रहा था NOT NULLऔर एक बराबर करना प्रारंभ कर count(*), तब भी आप के साथ एक से अधिक लुक-अप के लिए एक प्रणाली की मेज पर होगा count(*)

के रूप में EXPLAINउत्पादन, वहाँ है एक संकेत:

EXPLAIN SELECT count(*) FROM ...

Aggregate  (cost=4963.38..4963.43 rows=1 width=0) ...


EXPLAIN SELECT count(pk) FROM ...

Aggregate  (cost=4963.38..4963.43 rows=1 width=4) ...

मतलब, count(col)है नहीं करने के लिए परिवर्तित count(*), भले ही यह निर्धारित किया है NOT NULL


क्या अभी भी नए संस्करणों के साथ ऐसा ही है? मुझे लगता है कि इसे वास्तव में हर क्वेरी के लिए एक खोज की आवश्यकता नहीं होगी - इसे कैश किया जा सकता है।
ओन्द्रा kaयूस्का

1
Btw, एक NOT NULLस्तंभ के साथ , अंतर बहुत बड़ा है यदि आपके पास बहुत सारी पंक्तियाँ हैं। हमारे मामले में लाखों पंक्तियों के साथ, COUNT(*)3 गुना तेज है। (पोस्टग्रैस 9.4)
ओन्ड्रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.