替代使用 ROW_NUMBER 以获得更好的性能

Bru*_*dit 2 sql sql-server

我在下面有一个小查询,它RowNumber根据对“LegKey”列进行分区并按 UpdateID desc 排序,在该列下输出一个行号。因此,每个legkey 的最新更新行 (UpdateID) 始终为 1

SELECT *
, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber 
FROM Data.Crew
Run Code Online (Sandbox Code Playgroud)

输出数据:

UpdateID    LegKey  OriginalSourceTableID   UpdateReceived          RowNumber
7359        6641    11                     2016-08-22 16:35:27.487  1
7121        6641    11                     2016-08-15 00:00:47.220  2
8175        6642    11                     2016-08-22 16:35:27.487  1
7122        6642    11                     2016-08-15 00:00:47.220  2
8613        6643    11                     2016-08-22 16:35:27.487  1
7123        6643    11                     2016-08-15 00:00:47.220  2
Run Code Online (Sandbox Code Playgroud)

我使用这种方法的问题是性能变慢,因为我假设我使用的是 ORDER BY。

我的问题是有没有其他方法可以产生类似的结果,但让我的查询运行得更快?我想MAX()可能会起作用,但我没有得到与以前相同的输出。也许我做了MAX()错误的陈述,所以想知道如果有人可以提供一个关于他们如何MAX()为这个例子编写陈述的例子,这是否是一个很好的选择?

谢谢

Gor*_*off 5

大概这是您要优化的查询:

SELECT c.*
FROM (SELECT c.*,
             ROW_NUMBER() OVER (PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber 
      FROM Data.Crew c
     ) c
WHERE RowNumber = 1;
Run Code Online (Sandbox Code Playgroud)

在 上尝试索引Crew(LegKey, UpdateId)

如果您执行以下操作,也将使用此索引:

SELECT c.*
FROM Data.Crew c
WHERE c.UpdateId = (SELECT MAX(c2.UpdateId)
                    FROM Data.Crew c2
                    WHERE c2.LegKey = c.LegKey
                   );
Run Code Online (Sandbox Code Playgroud)