我有一个很长的复杂SQL查询(在Microsoft SQL Server 2012中),我需要提高性能。我有一个问题,SQL查询在from语句之前有一个'select top 1'。很难解释,所以在这篇文章下面我写了一个带有这个问题的示例SQL查询:
select
Player.Firstname,
Player.Lastname,
LastGameGoals =
(select top 1 Goals
from PlayerSummary
where PlayerSummary.PlayerID = Player.PlayerId
order by PlayerSummaryId desc)
from Player
上面的SQL获得了曲棍球运动员的名字和姓氏以及特定球员最后一场比赛的进球数。由于数据库非常大,因为选择了top 1语句,它会变得非常慢。
我当然可以添加一个索引以获得更好的性能,但是我可以避免在每个玩家行上“选择前1”吗?
如何改善表现?
答案 0 :(得分:1)
对于本声明:
LastGameGoals =
(select top 1 Goals
from PlayerSummary
where PlayerSummary.PlayerID = Player.PlayerId
order by PlayerSummaryId desc)
你想要一个索引。最佳指数是PlayerSummery(PlayerId, PlayerSummaryId, Goals)
。这是子查询的覆盖索引,因此它应该对性能产生很大影响。
我不明白你为什么要避开索引。您可以使用窗口函数重写查询:
select p.*,
ps.goals as LastGameGoals
from player p left join
(select ps.*,
row_number() over (partition by playerId order by PlayerSummaryId desc) as seqnum
from PlayerSummary ps
) ps
on p.playerid = ps.playerid and ps.seqnum = 1;
你应该测试,但我的猜测是索引会更快。