在使用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
答案 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()
需要对整行进行排序。这种性能差异只是知情推测。