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

时间:2011-03-31 14:03:50

标签: sql sql-server sql-server-2008

我有一个包含标识列Id的表。

执行时:

 select max(Id) from Table

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

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

我可以手动查看吗?

6 个答案:

答案 0 :(得分:16)

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

IDENT_CURRENT('MyTable')

但是,使用此功能时要小心。失败的事务仍然可以增加此值,并且,如Quassnoi所述,此行可能已被删除。

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

答案 1 :(得分:5)

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

IDENTITY的值不再与实际数据相对应。

如果要快速查找MAX(id),则应在其上创建索引(或者可能将其声明为PRIMARY KEY

答案 2 :(得分:3)

表格是否聚集在该列上? 你能使用Top 1:

SELECT TOP 1 [ID]     
FROM [Table]
order by ID desc

答案 3 :(得分:1)

我很确定你可以按降序在该字段上设置索引,并使用它来查找最大的密钥。它应该很快。

答案 4 :(得分:1)

您可以运行以下语句并删除最后一个UNION ALL。运行此语句以获取当前标识值。

SELECT 
  ' SELECT '+char(39)+[name]+char(39)+' AS table_name, IDENT_CURRENT('+char(39)+[name]+char(39)+') AS currvalue UNION ALL'
  AS currentIdentity
FROM sys.all_objects WHERE type = 'U'

答案 5 :(得分:0)

Id是主键还是索引?在这种情况下似乎应该寻求。