2012-10-10 44 views
0

我有一个表,说scope_test如下:来自表的范围标识()和范围标识()之间的性能差异?

create table scope_test 
(
id int identity(1,1), 
val varchar(100) 
) 

现在,当我在这个表中插入一行,并通过2个不同的SQL语句选择范围身份,我能看到在2条语句的性能差异:

insert into scope_test values('abcd') 
select scope_identity() -- statement 1 
select scope_identity() from scope_test -- statement 2 

语句1根据执行计划比语句2快:

enter image description here

我很好奇: 1.为什么这是性能差异,和 2.使用范围标识()作为语句1中使用的安全性,即没有表名称?

+4

您应该只使用语句1.使用'from'子句查询'scope_identity'是没有意义的。 –

+1

也许您正在查找或考虑['IDENT_CURRENT'](http://msdn.microsoft.com/zh-cn/library/ms175098.aspx)?当然,在具有任何并发​​性的系统中,这是一个毫无意义的功能。 –

+0

谢谢@Damien_The_Unbeliever – Seasoned

回答

4

性能的差异仅仅是因为你在做不同的事情。 scope_identity的第二次使用不只是获取最后的标识,它将获取表中的所有记录,并为表中的每个记录从scope_identity()中选择值。对于表中存在的每个记录,您只需从scope_identity()中获取一次值。

因此,第二次使用scope_identity()是毫无意义的,它将返回相同的值一次或多次(或者如果查询中使用的表为空,则返回零次)。 scope_identity()的值与您在查询中使用的表格没有任何关系,即,如果您在不同的表格中插入记录,则不能使用它来获取插入特定表格中的最后一个ID。

+0

在这种特殊情况下:表格是新创建的,并且一条记录已被插入,因此第二次使用必须返回恰好一行,并带有正确的编号。对于一般情况,你是对的。 – hvd