2016-07-25 55 views
5

在MS SQL Server中使用ROW_NUMBER和使用IDENTITY与ORDER BY语句之间是否有区别(在结果集,性能或语义上)?例如,给定一个表与列“姓”是有ROW_NUMBER与IDENTITY和ORDER BY

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

看看这两个选项的执行计划。这会给你一个很好的表现指标。我怀疑会有太大的区别。 –

+0

@scsimon不是100%肯定有关 – JamieD77

+0

@scsimon第二个查询有一个顺序,所以输出将是相同的。根据定义,表格没有顺序。 –

回答

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()整行需要排序。这种性能差异只是通知了猜测。