高效获取最后一条记录

1 sql-server sql-server-2012 greatest-n-per-group

我有一个包含 OrderId 的表订单(WarehouseId 和 OrderId 是复合主键)。

WarehouseId | OrderId | ItemId | OrderDate
-------------------------------------------
          1 |       1 |      1 | 2016-08-01
          1 |       2 |      2 | 2016-08-02
          1 |       3 |      5 | 2016-08-10
          2 |       1 |      1 | 2016-08-05
          3 |       1 |      6 | 2016-08-06
Run Code Online (Sandbox Code Playgroud)

(表格已简化,仅显示必填字段)

如何有效地选择特定仓库的最后一个订单?我目前这样做:

SELECT TOP 1 * FROM tblOrder WHERE WarehouseId = 1 ORDER BY OrderId DESC
Run Code Online (Sandbox Code Playgroud)

我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?

或者,有没有更有效的方法来选择最后一个订单记录?

wBo*_*Bob 7

在适当的情况下,数据库引擎可以进行反向扫描,即直接到索引的末尾并反向工作,因此它既好又高效。您可以在扫描运算符的“扫描方向”属性下的查询执行计划中看到这一点。对于您的示例,使用 WarehouseId,OrderId 上的复合主键,这将起作用:

向后扫描

正如您所做select *的那样,聚集索引已经覆盖了整个查询,因此不需要额外的书签查找。