Sql 使用行数的替代方案可获得更好的性能

Sql 使用行数的替代方案可获得更好的性能,sql,sql-server,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 输出的数据: UpdateID LegKey OriginalSourceTableID

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

SELECT *
, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber 
FROM Data.Crew
输出的数据:

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
这个方法的问题是我的性能变慢了,因为我假设我使用的是orderby

我的问题是,是否有其他方法可以产生类似的结果,但让我的查询运行得更快?我想一个
MAX()
可以工作,但是我没有得到与以前相同的输出。也许我的
MAX()
语句做得不正确,所以我想知道这是否是一个好的选择,如果有人能提供一个例子,说明如何为这个例子编写
MAX()
语句


谢谢

您可以尝试以下方法之一:

declare @Table table(UpdateID int,   LegKey int,  OriginalSourceTableID int,  UpdateReceived datetime)
这里使用子查询中的最大日期

select * from @Table as a where a.UpdateReceived = (Select MAX(UpdateReceived) from @Table as b Where b.LegKey = a.LegKey)
在这里,您可以在cte中与group by一起使用它

with MaxDate as( Select LegKey, Max(UpdateReceived) as MaxDate from @Table group by LegKey ) 
select * from MaxDate as a   
inner join @Table as b 
     on b.LegKey=a.LegKey 
    and b.UpdateReceived=a.MaxDate

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

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;
乘员(LegKey,UpdateId)
上尝试索引

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

SELECT c.*
FROM Data.Crew c
WHERE c.UpdateId = (SELECT MAX(c2.UpdateId)
                    FROM Data.Crew c2
                    WHERE c2.LegKey = c.LegKey
                   );

这个表上有什么索引?@Cory我在LegKey列上有一个非唯一的非聚集索引,在主键UpdateID上有一个聚集索引。我无权在表中操纵这些索引,只是为了让您知道,您可以参考我在这里的回答。我解释了四种不同的方法,与您的案例类似。MaxDate显示在方法4和2中。@AhmedSaeed如果你不介意的话,如果你在我的示例中应用方法4和方法2,这样我就100%知道它是如何工作的,如果你不介意的话,这样可以吗?根据我的经验,行数比任何其他方法都快。因此,我建议您首先测试其他方法,看看是否有明显更快的方法(值得怀疑)。然后,如果您想要更好的性能,您需要查看查询计划,是的,您很可能需要应用或更改索引。这真的是您的完整查询,还是您也在过滤其他内容和/或过滤
行数的结果?