PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Tabella da molti a molti:le prestazioni sono pessime

Soprattutto, hai bisogno di un indice su playersinclubs(club_id, player_id) . Il resto sono dettagli (che possono comunque fare la differenza).
Devi essere preciso sui tuoi obiettivi reali. Scrivi tu:

Non è necessario iscriversi al club proprio per questo:

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

E non hai bisogno delle colonne playersinclubs anche nell'output, che è un piccolo guadagno per le prestazioni, a meno che non consenta un solo indice scansiona su playersinclubs , allora potrebbe essere sostanziale.

Probabilmente non ti servono tutti colonne di player anche nel risultato. Solo SELECT le colonne di cui hai effettivamente bisogno.

Il PK su player fornisce l'indice di cui hai bisogno su quella tabella.

Hai bisogno di un indice su playersinclubs(club_id, player_id) , ma non rendilo unico a meno che ai giocatori non sia consentito entrare nello stesso club una seconda volta.

Se i giocatori possono unirsi più volte e vuoi solo un elenco di "tutti i giocatori", devi anche aggiungere un DISTINCT passo per piegare le voci duplicate. Potresti semplicemente:

SELECT DISTINCT p.* ...

Ma dal momento che stai cercando di ottimizzare le prestazioni:è più economico eliminare i duplicati in anticipo:

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

Forse vuoi davvero tutto voci in playersinclubs e anche tutte le colonne della tabella. Ma la tua descrizione dice il contrario. La query e gli indici sarebbero diversi.

Risposta strettamente correlata: