PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Table plusieurs à plusieurs - Les performances sont mauvaises

Plus important encore, vous avez besoin d'un index sur playersinclubs(club_id, player_id) . Le reste n'est que détails (qui peuvent encore faire une grande différence).
Vous devez être précis sur vos objectifs réels. Vous écrivez :

Vous n'avez pas besoin d'adhérer au club pour ça du tout :

SELECT p.* 
FROM   playersinclubs pc
JOIN   player         p ON p.id = pc.player_id
WHERE  pc.club_id = 3;

Et vous n'avez pas besoin des colonnes playersinclubs dans la sortie non plus, ce qui est un petit gain pour les performances - à moins qu'il n'autorise un index uniquement scanner sur playersinclubs , alors il peut être substantiel.

Vous n'avez probablement pas besoin de tout colonnes de player dans le résultat non plus. Uniquement SELECT les colonnes dont vous avez réellement besoin.

Le PK sur player fournit l'index dont vous avez besoin sur cette table.

Vous avez besoin d'un index sur playersinclubs(club_id, player_id) , mais ne le faites pas rendez-le unique à moins que les joueurs ne soient pas autorisés à rejoindre le même club une seconde fois.

Si les joueurs peuvent rejoindre plusieurs fois et que vous voulez juste une liste de "tous les joueurs", vous devez également ajouter un DISTINCT étape pour plier les entrées en double. Vous pouvez simplement :

SELECT DISTINCT p.* ...

Mais puisque vous essayez d'optimiser les performances :il est moins coûteux d'éliminer les doublons plus tôt :

SELECT p.*
FROM  (
   SELECT DISTINCT player_id
   FROM   playersinclubs
   WHERE  club_id = 3;
   ) pc
JOIN   player p ON p.id = pc.player_id;

Peut-être que vous voulez vraiment tout entrées dans playersinclubs ainsi que toutes les colonnes du tableau. Mais votre description dit le contraire. La requête et les index seraient différents.

Réponse étroitement liée :