2016-07-25 63 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()整行需要排序。這種性能差異只是通知了猜測。