web-dev-qa-db-fra.com

Rejoignez plusieurs colonnes avec OR

J'ai une table de 1 million d'enregistrements pour rejoindre une autre table avec 100 000 enregistrements. Cependant, il existe 5 clés potentielles (supposons le numéro de compte, l'adresse e-mail, le numéro de membre, l'adresse e-mail alternative et le numéro d'identification) dans le tableau 1 et 60 colonnes () dans le tableau 2 qui doivent être utilisées comme clés de jonction. Donc, mon code serait quelque chose comme ci-dessous:

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 OR 
t1.col1 = t2.col2 OR
t1.col1 = t2.col3 OR
...
t1.col5 = t2.col1 

et ainsi de suite. La combinaison de 5 et 60 est énorme et elle tue le serveur. Cela ne semble pas non plus logique. Je pensais mettre 60 colonnes en ligne et augmenter le nombre d'enregistrements pour réduire le nombre de colonnes. Cependant, je ne sais pas encore si c'est la meilleure solution. Toute solution qui ne tue pas le serveur est très appréciée.

Remarque: Veuillez noter que chaque colonne de tb1 doit être comparée à 10-15 colonnes dans tbl2. Par exemple, la colonne col1 contenant "Numéro de compte" est associé à col1-10 qui détient tous les "Numéro de compte" potentiels. col1 n'est en aucun cas associé à une adresse e-mail ou à d'autres colonnes.

4
Espanta

Bien que je pense que vous devriez envisager de modifier la configuration, vous pouvez essayer l'approche UNION.

Au lieu de créer plusieurs OR jointures, vous pouvez effectuer des requêtes spécifiques par cas, puis les UNION ensemble. Ensuite, vous avez la possibilité de faire en sorte que chaque requête individuelle utilise des index.

Donc quelque chose comme

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 

UNION 

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col2

.....

UNION 

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col5 = t2.col1

et ainsi de suite.....

En faisant cela, j'envisagerais également de sélectionner uniquement la clé dans la table au lieu de *; et dans une structure temporaire. À partir de là, sélectionnez la clé et joignez-vous et sélectionnez avec vos données, afin de minimiser la taille de chaque index individuel pour les requêtes UNION.

(Mais - vous devriez sérieusement envisager de changer la structure à mon avis)

6
Allan S. Hansen

Je ne pense pas qu'il existe un moyen pour que cette requête fonctionne correctement, mais le code sera plus facile à lire si vous utilisez le prédicat IN:

select * 
from tbl1 t1 
join tbl2 t2 
    on t1.col1 in (t2.col1, t2.col2, ...) 
    or ...
    or t1.col5 in (t2.col1, ... )
7
Lennart