2017-09-28 11 views
1

J'effectue des requêtes sql sur la table interim_19 avec 67.500 lignes. Table n'est pas indexée, et a 7 colonnes, dont non sont des clés uniques/primaires, parce que les données principales Abonent et idBase se répètent, parmi toutes les données que j'ai comme 7-8 distincts idBases et ~ 10.000 différents Abonents, et les autres données comme date n'est pas fiable en termes d'unicité.Slow SQL INNER JOIN

Le problème réside dans les jointures internes lentes sur cette table.

Et si je joue SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286) ça va prendre 1.33 secondes, et SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406) prendra 1,9 secondes, que ce soit

SELECT * FROM (SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286)) 
temp1 
inner join 
(SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406)) temp2 
on temp1.Abonent = temp2.Abonent 

prend toujours - 147-157 secondes. Je comprends que la jointure interne compare chaque ligne à chaque autre rangée sur la deuxième table, mais cela ne devrait pas prendre autant de temps. OFC il fait des doublons, mais j'ai besoin de tous les 7 + 7 lignes, donc ...

P.S J'essaie déjà de l'indexer, donc d'autres conseils sont également les bienvenus.

+0

Je ne vois pas de raison pour les tables dérivées et joint directement les tables. En outre, sélectionnez uniquement les colonnes dont vous avez réellement besoin. "SELECT *" ne vous rend pas service. –

+0

Est-ce mySql ou SQL Server? S'il vous plaît modifier vos tags –

Répondre

2

Ajouter le « composite » INDEX(idBase, Abonent)

(Et, comme d'autres font remarquer , utilisez un JOIN, pas une sous-requête.)

Un INDEX n'a pas besoin d'être "unique". 147 secondes était parce que les sous-requêtes ont été effectuées plusieurs fois fois, en regardant chaque fois 67K lignes. Je pense que mon index, ci-dessus, aidera toutes les questions mentionnées jusqu'à présent.

+0

Merci, en ajoutant l'index sur deux éléments l'a amélioré de 147 sec à 0.8. – upicik

2

Essayez d'éliminer les sous-requêtes inutiles:

SELECT * 
FROM interim_19 t1 
INNER JOIN interim_19 t2 
    ON t1.Abonent = t2.Abonent 
WHERE 
    t1.idBase IN (1551 , 4228) AND 
    t2.idBase IN (1535 , 5406) 

Au-delà, vous pourriez envisager d'ajouter un index sur la colonne idBase. Et comme suggéré dans les commentaires, vous pouvez également essayer de réduire votre liste de sélection.

+0

et si j'ai une autre idBase à comparer, comment ajouter une autre jointure interne ici? – upicik

+0

Si vous avez une autre question, alors vous pourriez vouloir poser une nouvelle question plutôt que de changer votre question actuelle. –

+0

NON, je veux dire, je veux ajouter une autre jointure à cette requête. Devrait-il être: 'SELECT * FROM interim_19 t1 INNER JOIN intermédiaire_19 t2 ON t1.Abonent = t2.Abord INNER JOIN intermédiaire_19 t3 ON t3.Abonent = t2.Abonent O t t1.idBase IN (1551, 4228) ET t2.idBase IN (1535, 5406) ​​ET t3.idBase IN (29551618) ' – upicik

2

Les sous-requêtes n'ont pas d'index. Essayez de les éviter aussi longtemps que possible:

SELECT * 
FROM interim_19 t1 
INNER JOIN interim_19 t2 
    ON (t1.Abonent = t2.Abonent AND t2.idBase IN (1535 , 5406)) 
WHERE 
    t1.idBase IN (1551 , 4228) 

sera un peu plus rapide que la réponse de Tim ...

+0

Et si j'avais une autre idBase à comparer, comment ajouter une autre jointure interne ici? – upicik