PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Tabela Muitos para Muitos - O desempenho é ruim


Mais importante, você precisa de um índice em playersinclubs(club_id, player_id) . O resto são detalhes (que ainda podem fazer muita diferença).
Você precisa ser preciso sobre seus objetivos reais. Você escreve:

Você não precisa se associar ao club para tudo isso:
SELECT p.* 
FROM   playersinclubs pc
JOIN   player         p ON p.id = pc.player_id
WHERE  pc.club_id = 3;

E você não precisa de colunas playersinclubs na saída, o que é um pequeno ganho de desempenho - a menos que permita um índice somente escaneie em playersinclubs , então pode ser substancial.

Você provavelmente não precisa de todos colunas de player no resultado também. Apenas SELECT as colunas que você realmente precisa.

O PK no player fornece o índice que você precisa nessa tabela.

Você precisa de um índice em playersinclubs(club_id, player_id) , mas não torná-lo único, a menos que os jogadores não possam ingressar no mesmo clube uma segunda vez.

Se os jogadores puderem entrar várias vezes e você quiser apenas uma lista de "todos os jogadores", você também precisará adicionar um DISTINCT passo para dobrar entradas duplicadas. Você poderia apenas:
SELECT DISTINCT p.* ...

Mas como você está tentando otimizar o desempenho:é mais barato eliminar dupes cedo:
SELECT p.*
FROM  (
   SELECT DISTINCT player_id
   FROM   playersinclubs
   WHERE  club_id = 3;
   ) pc
JOIN   player p ON p.id = pc.player_id;

Talvez você realmente queira todos entradas em playersinclubs e todas as colunas da tabela também. Mas sua descrição diz o contrário. Consulta e índices seriam diferentes.

Resposta intimamente relacionada: