आप शायद यह नहीं सुनना चाहते, लेकिन सबसे अच्छा विकल्प SELECT DISTINCTयह है कि शुरुआत करने से बचें DISTINCT । कई मामलों में (सभी नहीं!) बेहतर डेटाबेस-डिज़ाइन या बेहतर प्रश्नों से बचा जा सकता है।
कभी-कभी, GROUP BYतेज, क्योंकि यह एक अलग कोड पथ लेता है।
में अपने विशेष मामले में, यह प्रतीत नहीं होता है कि आप से छुटकारा पा सकते DISTINCT। यदि आप उस तरह के कई प्रश्न हैं, तो आप एक विशेष सूचकांक के साथ क्वेरी का समर्थन कर सकते हैं:
CREATE INDEX foo ON events (project_id, "time", user_id);
जोड़ना user_idकेवल तभी उपयोगी है जब आपको इसमें से केवल-इंडेक्स मिले । विवरण के लिए लिंक का अनुसरण करें। अपने क्वेरी प्लान से महंगे बिटमैप हीप स्कैन को हटा देगा , जिसमें 90% क्वेरी समय की खपत होती है।
आपका EXPLAINआउटपुट मुझे बताता है कि क्वेरी को आधे मिलियन मिलान वाली पंक्तियों में से 2,491 विशिष्ट उपयोगकर्ताओं को संघनित करना है। यह सुपर-फास्ट नहीं बनेगा, चाहे आप कुछ भी करें, लेकिन यह काफी तेजी से हो सकता है।
यदि आपके प्रश्नों में समय अंतराल हमेशा समान होता है, तो प्रति MATERIALIIZED VIEWतह एक लंबा रास्ता तय करेगा। अलग-अलग समय अंतराल के साथ कोई मौका नहीं, हालांकि। हो सकता है कि आप प्रति घंटे या किसी अन्य न्यूनतम समय इकाई में कम से कम उपयोगकर्ताओं को मोड़ सकें, और जो कि पर्याप्त ओवरहेड वारंट के लिए पर्याप्त प्रदर्शन खरीदेंगे।user_id(project_id, <fixed time intervall>)
नाइटपिक:
सबसे अधिक संभव है, "time"वास्तव में भविष्यवाणी की जानी चाहिए:
AND "time" >= '2015-01-11 8:00:00'
AND "time" < '2015-02-10 8:00:00';
एक तरफ: पहचानकर्ता के रूप में
उपयोग न करें time। यह मानक एसक्यूएल में एक आरक्षित शब्द है और पोस्टग्रेज में एक मूल प्रकार है।