2012-10-10 86 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