Левое соединение приводит к огромному снижению производительности. Как это исправить - PullRequest
0 голосов
/ 17 октября 2019

У меня есть 3 отдельных запроса, и когда я объединяю их с помощью левого соединения, падение производительности огромно

Есть идеи, почему это может происходить или как решить эту проблему?

Здесьзапросы

первый запрос

SELECT MONEY,
       AccountLevel,
       BadgeCount,
       EloWin,
       TournamentOfficBattleTotal,
       MaximumTowerLevel,
       NpcBattleVictoryCount
FROM table_2
WHERE table_2.UserId = 465903

второй запрос

  SELECT COUNT(DISTINCT table_1.PokemonId) AS PokedexOwnage
  FROM table_1 WHERE UserId = 465903

третий запрос

  SELECT COUNT(*) AS PokedexEvent
  FROM table_3 WHERE UserId = 465903

и здесь мое решение объединить все 3 в один

  SELECT MONEY,
         AccountLevel,
         BadgeCount,
         COUNT(DISTINCT table_1.PokemonId) AS PokedexOwnage,
         COUNT(DISTINCT table_3.PokemonId) AS PokedexEvent,
         EloWin,
         TournamentOfficBattleTotal,
         MaximumTowerLevel,
         NpcBattleVictoryCount
  FROM table_2
  LEFT JOIN table_1 ON table_1.UserId = table_2.UserId
  LEFT JOIN table_3 ON table_3.UserId = table_2.UserId 
  WHERE table_2.UserId = 465903
GROUP BY AccountLevel,
         BadgeCount,
         EloWin,
         TournamentOfficBattleTotal,
         MaximumTowerLevel,
         NpcBattleVictoryCount,
         MONEY

Когда я сравниваю с помощью плана выполнения, первые 3 запроса принимают 0% относительной стоимости кпоследний запрос

enter image description here

enter image description here

1 Ответ

2 голосов
/ 17 октября 2019

Совокупность до присоединения. Один метод использует коррелированные подзапросы:

SELECT MONEY, AccountLevel, BadgeCount, EloWin,
       TournamentOfficBattleTotal, MaximumTowerLevel, NpcBattleVictoryCount,
       (SELECT COUNT(DISTINCT t1.PokemonId)
        FROM table_1 t1
        WHERE t1.UserId = t2.UserId
       ) as PokedexOwnage,
       (SELECT COUNT(*)
        FROM table_3 t3
        WHERE t1.UserId = t3.UserId
       ) as PokedexEvent
FROM table_2 t2
WHERE t2.UserId = 465903;

Это, вероятно, будет хорошо. Но для повышения производительности убедитесь, что у вас есть индексы table_2(UserId, PokemonId) и table_3(UserId).

...