स्पष्टता के लिए अपनी क्वेरी योजना को पुन:स्वरूपित करना:
QUERY PLAN Aggregate (cost=126377.96..126377.97 rows=1 width=0)
-> Hash Join (cost=6014.51..126225.38 rows=61033 width=0)
Hash Cond: (contacts_lists.contact_id = plain_contacts.contact_id)
-> Hash Join (cost=3067.30..121828.63 rows=61033 width=8)
Hash Cond: (contacts_lists.contact_id = contacts.id)
-> Index Scan using index_contacts_lists_on_list_id_and_contact_id
on contacts_lists (cost=0.00..116909.97 rows=61033 width=4)
Index Cond: (list_id = 66996)
-> Hash (cost=1721.41..1721.41 rows=84551 width=4)
-> Seq Scan on contacts (cost=0.00..1721.41 rows=84551 width=4)
Filter: ((NOT email_bad) AND (NOT email_unsub))
-> Hash (cost=2474.97..2474.97 rows=37779 width=4)
-> Seq Scan on plain_contacts (cost=0.00..2474.97 rows=37779 width=4)
Filter: has_email
दो आंशिक अनुक्रमणिका हो सकता है अपने डेटा वितरण के आधार पर seq स्कैन को समाप्त करें:
-- if many contacts have bad emails or are unsubscribed:
CREATE INDEX contacts_valid_email_idx ON contacts (id)
WHERE (NOT email_bad AND NOT email_unsub);
-- if many contacts have no email:
CREATE INDEX plain_contacts_valid_email_idx ON plain_contacts (id)
WHERE (has_email);
हो सकता है कि आप किसी विदेशी कुंजी पर एक अनुक्रमणिका खो रहे हों:
CREATE INDEX plain_contacts_contact_id_idx ON plain_contacts (contact_id);
अंतिम लेकिन कम से कम यदि आपने कभी अपने डेटा का विश्लेषण नहीं किया है, तो आपको चलाने की आवश्यकता है:
VACUUM ANALYZE;
यदि सब कुछ हो जाने के बाद भी यह धीमा है, तो आप अपने प्लेन_कॉन्टैक्ट्स और अपने कॉन्टैक्ट टेबल को मर्ज करने के लिए बहुत कुछ नहीं कर सकते हैं:उपरोक्त इंडेक्स के बावजूद उपरोक्त क्वेरी प्लान प्राप्त करने का मतलब है कि आपके अधिकांश/आपके सभी सब्सक्राइबर इसकी सदस्यता ले चुके हैं। विशेष सूची -- जिस स्थिति में उपरोक्त क्वेरी योजना आपको सबसे तेज़ मिलेगी।