sql >> Database >  >> RDS >> PostgreSQL

Many to Many Table - Prestaties zijn slecht

Het belangrijkste is dat je een index op playersinclubs(club_id, player_id) nodig hebt . De rest zijn details (die nog steeds een groot verschil kunnen maken).
Je moet precies zijn over je werkelijke doelen. Je schrijft:

Je hoeft niet lid te worden van club hiervoor helemaal:

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

En je hebt geen kolommen playersinclubs nodig in de uitvoer, wat een kleine winst is voor de prestaties - tenzij het een alleen-index . toestaat scan op playersinclubs , dan kan het aanzienlijk zijn.

Je hebt waarschijnlijk niet alle nodig kolommen van player ook in het resultaat. Alleen SELECT de kolommen die u echt nodig heeft.

De PK op player biedt de index die u nodig heeft voor die tabel.

Je hebt een index nodig op playersinclubs(club_id, player_id) , maar doe niet maak het uniek, tenzij spelers niet voor de tweede keer lid mogen worden van dezelfde club.

Als spelers meerdere keren kunnen deelnemen en je wilt alleen een lijst met "alle spelers", moet je ook een DISTINCT toevoegen stap om dubbele vermeldingen te vouwen. Je zou gewoon:

SELECT DISTINCT p.* ...

Maar aangezien u de prestaties probeert te optimaliseren:het is goedkoper om dupes vroegtijdig te elimineren:

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

Misschien wil je echt alles inzendingen in playersinclubs en ook alle kolommen van de tabel. Maar je beschrijving zegt iets anders. Query en indexen zouden anders zijn.

Nauw verwant antwoord:



  1. Tagsysteem:Toxi-oplossingsvragen

  2. Laat partities ouder dan 2 maanden vallen

  3. Tenant-ID doorgeven via sql-serververbinding

  4. Bereken de afstand tussen twee lat-lange punten in Oracle