sql - Kaminari is slow with COUNT(*) on a huge table in Postgres -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 6 उत्तर
मैं कबीनारी का उपयोग कर रहा हूं मणि एक बड़ी तालिका (~ 1.5 एमएम पंक्तियों) पर क्वेरी को पृष्ठांकित करने के लिए। वास्तविक परिणाम पृष्ठों को लेकर बहुत जल्दी (~ 20 मि।), कैमिनरी का जोड़ा SELECT COUNT (*) कहां है ....
बेहद धीमी है, और निष्पादन समय के लिए कई अतिरिक्त सेकंड जोड़ता है।
क्या इसके बजाय परिणामों की संख्या का अनुमान लगाने का कोई तरीका है?
पूरी तालिका के लिए त्वरित अनुमान
संपूर्ण तालिका के लिए बहुत तेज़ अनुमान के लिए :
आपका उदाहरण पते पर संकेत देता है कहें कि हमारे पास एडीआर
स्कीमा सार्वजनिक
में एक मेज है:
का चयन करें reltuples से pg_class जहां ओआईडी = 'public.adr' :: regclass;
इस संबंधित उत्तर में अधिक विवरण:
स्थिति के साथ गिनती
शर्त के साथ गिनती के लिए, पोस्टग्रेज़ इसे तेज़ बनाने के लिए अनुक्रमणिका का उपयोग करें यह पोस्टग्रेस 9.2 में "कवर इंडेक्स" के साथ सुधार हुआ है, लेकिन उस से लाभ के लिए कुछ आवश्यकताओं को पूरा करना होगा।
शहर
और राज्य
पर स्थितियों के लिए पूछताछ के लिए, यह मल्टीकोलम् सूचकांक बहुत मदद करेगा, अगर स्थिति चयनात्मक (केवल पंक्तियों का एक छोटा प्रतिशत शर्त को पूरा करता है):
एडीआर (शहर, राज्य) पर विज्ञापन इंडेक्स adr_foo_idx बनाएँ;
यदि आपके पास विशिष्ट परिस्थितियों का छोटा समूह है, तो आप इसका उपयोग भी कर सकते हैं:
बनायें इंडेक्स adr_ny_ny_idx ON adr (adr_id) ) जहां शहर = 'न्यूयॉर्क' और राज्य = 'NY';
... (राज्य, शहर) के प्रत्येक सेट के लिए
या दोनों के संयोजन:
विज्ञापन इंडेक्स adr_ny_idx ON adr (city) WHERE स्थिति = 'NY';
... एक प्रति राज्य
सामान्यीकृत
बेशक, अपनी बड़ी तालिका बनाने के लिए सब कुछ (और अनुक्रमित) छोटी मदद करता है शहरों और शहरों के लिए तालिकाओं की तलाश बेमानी भंडारण पर कटौती करने के लिए एक लंबा रास्ता तय करेंगे यहां कुंजी शब्द है।
इसके बजाय:
बनाओ टेबल ऐडीआर (adr_id सीरियल प्राथमिक कुंजी, राज्य पाठ, शहर पाठ ...); चयन संख्या (*) एडमिर से कहाँ शहर = 'न्यूयॉर्क' और राज्य = 'एनवाई';
अपने डेटाबेस डिजाइन को सामान्य बनाएं और उचित अनुक्रमित का उपयोग करें:
बनाओ टेबल राज्य (state_id सीरियल प्राथमिक कुंजी, राज्य पाठ UNIQUE); सारणी शहर बनाएँ (city_id सीरियल प्राथमिक कुंजी, राज्य_आईडी int संदर्भ राज्य, शहर पाठ, अद्वितीय (राज्य_आईडी, शहर)); टेबल adr (adr_id सीरियल प्राथमिक कुंजी city_id int संदर्भ शहर बनाएँ ...); एडीआर (city_id) पर इंडेक्स adr_city_idx बनाएं; राज्य से जुड़ें (*) राज्य से जुड़ने से (*) राज्य का उपयोग USING (राज्य_आईडी) एक USING (city_id) जहां एस.स्टेट = 'एनवाई' और c.city = 'New York' शामिल हों
तालिका और सूचकांक छोटे हो जाते हैं। पूर्णांक संभाल टेक्स्ट की तुलना में तेज़ है सब कुछ तेज हो जाता है।
उस पर, यदि प्रदर्शन महत्वपूर्ण है, और जब से आपको सटीक की ज़रूरत नहीं है, तो आप भौतिक दृश्य का उपयोग कर सकते हैं प्रासंगिक परिस्थितियों के लिए गणना के साथ संख्याओं को अद्यतित रखने के लिए आपके चयन के ईवेंट या समय पर दृश्य को रीफ्रेश करें विवरण के लिए मैनुअल के लिए लिंक का पालन करें। पोस्टेज 9.3 की आवश्यकता होती है, लेकिन आप इसे किसी भी संस्करण में मैन्युअल रूप से मैन्युअल रूप से कार्यान्वित कर सकते हैं।
Comments
Post a Comment