左联接会导致巨大的性能下降。如何修复

问题描述 投票:0回答:1

我有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

sql tsql left-join query-performance sql-server-2017
1个回答
2
投票

总计之前加入。一种方法是使用相关子查询:

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)上都有索引。

© www.soinside.com 2019 - 2024. All rights reserved.