2015-09-07 118 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()会更少一些

相关问题