在没有表扫描的情况下获取标识列的最大值

Blo*_*ard 8 sql sql-server sql-server-2008

我有一个带有Identity列的表Id.

当我执行:

 select max(Id) from Table
Run Code Online (Sandbox Code Playgroud)

SQL Server执行表扫描和流聚合.

我的问题是,为什么它不能简单地查找分配给Id的最后一个值?这是一个identity,所以必须跟踪信息,对吧?

我可以手动查看吗?

RB.*_*RB. 18

您可以使用IDENT_CURRENT查找要插入的最后一个标识值,例如

IDENT_CURRENT('MyTable')
Run Code Online (Sandbox Code Playgroud)

但是,使用此功能时要小心.失败的事务仍然可以递增此值,并且,作为Quassnoi状态,此行可能已被删除.

它可能会进行表扫描,因为它无法保证最后一个标识值是MAX值.例如,标识可能不是简单的递增整数.您可以使用递减整数作为您的身份.


Qua*_*noi 5

如果您删除了最新记录怎么办?

该值IDENTITY不再对应于实际数据.

如果你想快速查找MAX(id),你应该在它上面创建一个索引(或者可能声明它PRIMARY KEY)

  • @Blorgbeard:当然,我相信你,它的"SQL Server"却没有. (3认同)