ROW_NUMBER与IDENTITY和ORDER BY

时间:2016-07-25 18:29:43

标签: sql sql-server tsql

在使用ROW_NUMBER和在MS SQL Server中使用IDENTITY与ORDER BY语句之间是否存在任何差异(在结果集,性能或语义方面)?例如,给定一个带有“FirstName”列的表,

之间有任何区别
SELECT FirstName, ROW_NUMBER() OVER (ORDER BY FirstName) AS Position
INTO #MyTempTable
FROM MyTable

SELECT FirstName, IDENTITY(BIGINT) AS Position
INTO #MyTempTable
FROM MyTable
ORDER BY FirstName

1 个答案:

答案 0 :(得分:3)

语义是不同的。第一个示例创建一个带有顺序值的整数列。

第二个示例,使用identity()创建标识列。这意味着后续插入将增加。

例如,运行以下代码:

select 'a' as x, identity(int, 1, 1) as id
into #t;

insert into #t(x) values('b');

select *
from #t;

至于处理,在你的情况下,两者应该基本相同,因为需要对firstname进行排序。如果行数较宽,如果row_number()版本在性能方面略微超出另一个版本,我不会感到惊讶。使用row_number()时,只会对一列进行排序,然后将其映射回原始数据。使用identity()需要对整行进行排序。这种性能差异只是知情推测。