2015-09-07 160 views
2

如果我在視圖中使用NEWID那麼它將需要1毫秒,爲什麼在View中添加ROW_NUMBER需要花費太多時間來執行?

ALTER VIEW [dbo].[d] 
AS 

    SELECT 
     NEWID() AS Id, 
     p.XX 
     ,p.xx 

    FROM [view_XXX] as P 
GO 

select * .view_d where code='xxxx' 

但如果我使用ROW_NUMBER將太多的時間來完成,

ALTER VIEW [dbo].[d] 
AS 

    SELECT 
     Row_number()OVER(ORDER BY T.XXXXXX) AS Id, 
     p.XX 
     ,p.xx 

    FROM [view_XXX] as P 
GO 

select * .view_d where code='xxxx' 
+3

由於有'ORDER BY',我會想。該列是否有覆蓋索引? – Raj

+0

@Raj然後是什麼解決方案。 – user960567

+0

查看答案。每個人都給你很完美的答案。如果你需要使用'ROW_NUMBER()',那麼在'ORDER BY'中使用的列創建一個索引將會有所幫助,但是不能匹配'NEWID()'的速度。 – Raj

回答

5

我認爲,NEWID()總是創建任何隨機數字爲ID(不需要任何計算)但是在ROW_NUMBER()的情況下,SQL需要對列進行排序然後提供ID。

由於ROW_NUMBER()NEWID()更復雜SQL Server需要更多時間來處理它。

1

ROW_NUMBER()將有排序結果的額外成本,但NEWID()沒有這個費用
如果你看看執行計劃,你可以看到相同的:對對對Display Estimated Execution Plan圖標

點擊工具欄SSMS

請參閱下面的圖片。

NEWID()

ROW_NUMBER()

0

有後面使用NEWID()或ROW_NUMBER()

例如,對於需要paging in SQL Row_Number()不同的要求。如同Row_Number()一樣,NewID()函數也將爲每個數據行提供一種唯一值的方法,但不會幫助您提供SQL分頁,例如

並且NewID()每次都會返回同一行的不同數據查詢被執行。除非數據沒有改變,否則Row_Number()會更少一些

相關問題