मैं कोशिश कर रहा हूं COUNT(*)
150,000 पंक्तियों वाली एक तालिका की जिसमें एक प्राथमिक कुंजी है। यह लगभग 5 मिनट का उपकरण है, इसलिए मुझे लगा कि यह एक अनुक्रमण समस्या है।
PostgreSQL मैनुअल का हवाला देते हुए :
REINDEX सूचकांक की एक बूंद और विश्राम के समान है जिसमें सूचकांक सामग्री को खरोंच से फिर से बनाया गया है। हालांकि, लॉकिंग विचार अलग-अलग हैं। REINDEX लॉक लिखता है, लेकिन इंडेक्स की मूल तालिका नहीं पढ़ता है। यह संसाधित किए जा रहे विशिष्ट इंडेक्स पर एक अनन्य लॉक भी लेता है, जो उस इंडेक्स को उपयोग करने के प्रयास को अवरुद्ध कर देगा (...) बाद में बनाए गए इंडेक्स लॉक लिखता है, लेकिन पढ़ता नहीं है; चूंकि इंडेक्स नहीं है, इसलिए कोई भी रीड इसका उपयोग करने का प्रयास नहीं करेगा, जिसका अर्थ है कि कोई अवरोध नहीं होगा लेकिन रीड को महंगे अनुक्रमिक स्कैन में मजबूर किया जा सकता है।
अपने अनुभव से, क्या आप बता सकते हैं:
- है
REINDEXING
खतरनाक? क्या यह डेटा संगति को नुकसान पहुंचा सकता है? - क्या इसमें बहुत समय लग सकता है?
- क्या यह मेरे परिदृश्य का एक संभावित समाधान है?
अपडेट करें:
हमारे लिए काम करने वाला समाधान एक ही सूचकांक को अलग नाम से फिर से बना रहा था, फिर पुराने सूचकांक को हटा दिया गया।
इंडेक्स निर्माण बहुत तेज़ है, और हमने इंडेक्स का आकार 650 एमबी से घटाकर 8 एमबी कर दिया है। के COUNT(*)
साथ प्रयोग करने में between
केवल 3 सेकंड लगते हैं।
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.