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 快:

在此处输入图像描述

我很想知道:1. 为什么会有这种性能差异,以及 2. 使用语句 1 中使用的范围 identity() 是否安全,即没有表名?

4

1 回答 1

4

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

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

于 2012-10-10T06:12:17.450 回答