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)
我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?
或者,有没有更有效的方法来选择最后一个订单记录?
在适当的情况下,数据库引擎可以进行反向扫描,即直接到索引的末尾并反向工作,因此它既好又高效。您可以在扫描运算符的“扫描方向”属性下的查询执行计划中看到这一点。对于您的示例,使用 WarehouseId,OrderId 上的复合主键,这将起作用:
正如您所做select *的那样,聚集索引已经覆盖了整个查询,因此不需要额外的书签查找。
| 归档时间: |
|
| 查看次数: |
3652 次 |
| 最近记录: |