PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Много към много таблица - производителността е лоша

Най-важното е, че имате нужда от индекс на playersinclubs(club_id, player_id) . Останалото са подробности (които все още могат да имат голямо значение).
Трябва да сте точни относно действителните си цели. Вие пишете:

Не е необходимо да се присъединявате към club за това изобщо:

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

И нямате нужда от колони playersinclubs в изхода, което е малка печалба за производителността - освен ако не позволява само индекс сканиране в playersinclubs , тогава може да е значително.

Вероятно нямате нужда от всички колони на player в резултата също. Само SELECT колоните, от които всъщност се нуждаете.

PK на player осигурява индекса, от който се нуждаете в тази таблица.

Имате нужда от индекс на playersinclubs(club_id, player_id) , но направите направи го уникален, освен ако на играчите не е позволено да се присъединят към същия клуб втори път.

Ако играчите могат да се присъединят няколко пъти и вие просто искате списък с „всички играчи“, трябва също да добавите DISTINCT стъпка за сгъване на дублирани записи. Бихте могли просто:

SELECT DISTINCT p.* ...

Но тъй като се опитвате да оптимизирате производителността:по-евтино е да премахнете измамите рано:

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

Може би наистина искате всичко записи в playersinclubs и всички колони на таблицата също. Но вашето описание казва друго. Заявката и индексите биха били различни.

Тясно свързан отговор:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съхранявайте и индексирайте YAML с PostgreSQL, с Javascript lib или функции за многократна употреба?

  2. Как да приложим функция към всеки елемент от колона на масив в Postgres?

  3. Postgresql обработка на транзакции с java

  4. Алтернативи на счупен PL/ruby:конвертирайте таблица на складовия дневник

  5. използвайте командата database_name в PostgreSQL