Bonjour,
Question classique, je sais....
J'ai une BdD SQL Server avec (pour simplifier) 2 tables :
- Personne (UID, Nom, Prénom, DDN, Nom_UID, Prénom_UID) qui contient 7 millions de personnes.
Les champs Nom_UID et Prénom_UID sont associés à des ID uniques pour chaque nom et chaque prénom.
- Matches (Score, UID1, UID2) qui contient environ 700.000 lignes.
Cette table contient tous les scores de matching entre les noms, les prénoms...
Le Select que je veux faire :
Il tourne, tourne... et donne les résultats (environ 2.000) au bout de 20 minutes, ce qui est un peu long ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT 'H1-A'+ M.Score AS Score, P1.UID, P2.UID, '' FROM Matches M JOIN Personnes P1 ON M.UID1 = P1.Prénom_UID JOIN Personnes P2 ON M.UID2 = P2.Prénom_UID WHERE P1.DDN != '' AND P1.Nom = P2.Nom AND P1.DDN = P2.DDN AND P1.UID < P2.UID
J'ai 3 Index sur la table Matches : Un sur UID1, un sur UID2, et un sur (UID1, UID2)
Sur la table Personnes, j'ai des index sur les champs UID, Noms, DDN, Nom_UID et Prénom_UID.
Quand je demande à SQL de me montrer le plan, il m'indique qu'il fait (dans l'ordre):
- Une analyse de la table Matches (1%), suivi d'un Calcul scalaire (0%), puis d'un filtre (0%)
- une recherche d'index sur la table Personnes (P1). 6% . Index = Personnes_IX12
- Une correspondance de hash (jointure interne) 13 %
- une recherche d'index sur la table Personnes (P2). 7 % . Index = Personnes_IX12
- Une correspondance de hash (jointure interne). 73%
- Un calcul scalaire. 0%
- le SELECT. 0%
Description de l'Index Personnes_IX12 :
- Clé de l'index : DDN
- Colonnes incluses : UID, Nom, Prénom_UID
Même s'il y a 7 Millions de personnes dans la base, devoir attendre près de 20 minutes, ça fait un peu lent...
Surtout pour 2.000 réponses...
Je suis sur un PC avec 16 Go de RAM, et d'autres requêtes où, par exemple, je fais une auto-jointure entre la table Personnes se font rapidement (moins d'une minute.
Du genre :
Ca donne un résultat en 10 secondes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT P1.UID, P2.UID, '' FROM Personnes P1 JOIN Personnes P2 ON P1.Nom = P2.Nom AND P1.Prénom = P2.Prénom WHERE P1.DDN != '' and P2.DDN = ''
Que dois-je faire pour corriger le problème ?
Merci pour votre aide.
Partager