Nous utilisons PostgreSQL v8.2.3.
Il y a des tables impliquées: [~ # ~] employé [~ # ~] et [~ # ~] émailliste [~ # ~].
Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)
2 tables sont jointes de telle manière que si EMPLOYEE.EMAIL1 ou EMPLOYEE.EMAIL2 n'ont pas d'entrée correspondante, ces lignes seront renvoyées.
SELECT employee.email1, employee.email2,
e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
FROM employee
LEFT JOIN emaillist e1 ON e1.email = employee.email1
LEFT JOIN emaillist e2 ON e2.email = employee.email2
WHERE e1.email IS NULL OR e2.email IS NULL
La colonne EMAIL
qui est varchar (256) de la table EMAILLIST
est indexée. Maintenant, le temps de réponse est de 14 secondes.
Statistiques sur le nombre de tableaux: Actuellement, EMPLOYÉ a obtenu 165 018 enregistrements et EMAILLIST a obtenu 1 810 228 enregistrements, et les deux tableaux devraient augmenter à l'avenir.
REMARQUE: Mon exigence/cas d'utilisation réel est expliqué en détail ici .
Il n'y a rien de mal à indexer une colonne varchar si vous allez faire des requêtes basées sur celle-ci. Cependant, gardez à l'esprit qu'il existe des limites à certains index et combien ils peuvent indexer dans un seul champ. Exemple, vous ne pouvez pas indexer une colonne pouvant contenir une quantité illimitée de texte. Cependant, vous devriez pouvoir faire un index sur varchar (256) sans problème. Essayez-le et analysez les améliorations des performances de vos requêtes pour voir si cela vous aide.
Il n'y a aucun problème à indexer une colonne varchar en tant que telle
Lorsque cela peut devenir un problème, c'est lorsque vous avez la colonne varchar en tant que FK dans une table de milliards de lignes. Vous auriez alors une clé de substitution pour le PK et le FK, mais vous auriez toujours besoin d'une contrainte/d'un index unique sur la clé varchar naturelle.
Vos tables sont assez petites et les performances peuvent être liées à la clause OR. Malheureusement, le même problème s'applique quelle que soit la façon dont vous structurez la requête (et je ne connais pas suffisamment PostgresSQL pour offrir désolé)
Essayez de vous débarrasser de la partie "OU e2.email IS NULL" de votre requête et voyez à quelle vitesse elle s'exécute. Si elle s'exécute plus rapidement, vous pourrez peut-être l'exécuter plus rapidement avec une "union tout" "