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%知道它是如何工作的,如果你不介意的话,这样可以吗?根据我的经验,行数比任何其他方法都快。因此,我建议您首先测试其他方法,看看是否有明显更快的方法(值得怀疑)。然后,如果您想要更好的性能,您需要查看查询计划,是的,您很可能需要应用或更改索引。这真的是您的完整查询,还是您也在过滤其他内容和/或过滤
行数的结果?