Problème de performance de requêtes.
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 :
Code:
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 |
Il tourne, tourne... et donne les résultats (environ 2.000) au bout de 20 minutes, ce qui est un peu long ...
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 :
Code:
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 = '' |
Ca donne un résultat en 10 secondes...
Que dois-je faire pour corriger le problème ?
Merci pour votre aide.