我有一个包含标识列Id
的表。
执行时:
select max(Id) from Table
SQL Server执行表扫描和流聚合。
我的问题是,为什么它不能简单地查找分配给Id的最后一个值?它是identity
,因此必须跟踪信息,对吧?
我可以手动查看吗?
答案 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是主键还是索引?在这种情况下似乎应该寻求。