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

Mange til mange tabel - Ydeevnen er dårlig

Vigtigst af alt har du brug for et indeks på playersinclubs(club_id, player_id) . Resten er detaljer (der kan stadig gøre en stor forskel).
Du skal være præcis omkring dine faktiske mål. Du skriver:

Du behøver ikke tilmelde dig club til dette overhovedet:

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

Og du behøver ikke kolonner playersinclubs enten i outputtet, hvilket er en lille gevinst for ydeevnen - medmindre det tillader en kun indeks scan på playersinclubs , så kan det være væsentligt.

Du har sandsynligvis ikke brug for alle kolonner af player enten i resultatet. Kun SELECT de kolonner, du faktisk har brug for.

PK'en på player giver det indeks, du har brug for på den tabel.

Du skal bruge et indeks på playersinclubs(club_id, player_id) , men gør ikke gør det unikt, medmindre spillere ikke får lov til at blive medlem af den samme klub en anden gang.

Hvis spillere kan deltage flere gange, og du bare vil have en liste over "alle spillere", skal du også tilføje en DISTINCT trin for at folde duplikerede poster. Du kunne bare:

SELECT DISTINCT p.* ...

Men da du forsøger at optimere ydeevnen:det er billigere at eliminere duper tidligt:

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

Måske vil du virkelig have alt poster i playersinclubs og alle kolonner i tabellen også. Men din beskrivelse siger noget andet. Forespørgsel og indeks ville være anderledes.

Nært beslægtet svar:



  1. Hvordan kan jeg indsætte data i SQL Server ved hjælp af VBNet

  2. 3 måder at finde rækker, der indeholder små bogstaver i SQLite

  3. Kopier nogle få af kolonnerne i en csv-fil til en tabel

  4. Ser ORA-01858:et ikke-numerisk tegn blev fundet, hvor et numerisk var forventet