2011-04-19 4 views
0

Possible en double:
optimize Query in PostgreSQLoptimize requête dans PostgreSQL

SELECT count(*) 
FROM contacts_lists 
    JOIN plain_contacts 
      ON contacts_lists.contact_id = plain_contacts.contact_id 
    JOIN contacts 
      ON contacts.id = plain_contacts.contact_id 
WHERE plain_contacts.has_email 
     AND NOT contacts.email_bad 
     AND NOT contacts.email_unsub 
     AND contacts_lists.list_id =67339 

Ici contacts_lists.contact_id et contacts_lists.list_id sont indexées comment optimiser cette requête?

+0

Que dit 'EXPLAIN'? – DrColossos

+0

Pourquoi avez-vous posté la même question deux fois? –

+0

Celui-ci a été migré – jishi

Répondre

1

Vous voulez probablement l'index soit contacts.id ou plain_contacts.contact_id pour accélérer la jointure. L'un des deux champs devrait être une clé primaire.

Si cela ne suffit pas, vous aurez probablement besoin de factoriser la base de données. Pourquoi y a-t-il des contacts et des tables plain_contacts pour commencer?

1

Puisque vous voulez seulement inlude lignes qui a des drapeaux fixés dans les tables jointes, je propose que les déclarations dans la clause de jointure:

SELECT count(*) 
FROM contacts_lists 
    JOIN plain_contacts 
      ON contacts_lists.contact_id = plain_contacts.contact_id 
      AND NOT plain_contacts.has_email 
    JOIN contacts 
      ON contacts.id = plain_contacts.contact_id 
      AND NOT contacts.email_unsub 
      AND NOT contacts.email_bad 
WHERE contacts_lists.list_id =67339 

Je ne suis pas sûr que cela ferait un grand impact sur la performance, mais ça vaut le coup d'essayer. Vous devriez probablement avoir des index sur les tables jointes ainsi que des performances optimales, comme ceci:

plain_contacts: contact_id, has_email 
contacts: id, email_unsub, email_bad