为什么在View中添加ROW_NUMBER需要花费太多时间来执行?

时间:2015-09-07 06:36:44

标签: sql sql-server tsql

如果我在View中使用NewID,则需要1 ms,

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 个答案:

答案 0 :(得分:5)

我认为,NEWID()总是创建任意随机数作为ID(不需要任何计算)但是如果ROW_NUMBER() SQL需要对列进行排序,则提供ID。
<登记/> 由于ROW_NUMBER()NEWID()更复杂,SQL服务器需要更多时间来处理它。

答案 1 :(得分:1)

ROW_NUMBER()会产生额外的结果排序费用,但NEWID()不会产生此费用 如果查看执行计划,您可以看到相同的内容:

  

点击工具栏Display Estimated Execution Plan

上的SSMS图标

见下面的图片。

NEWID()

ROW_NUMBER()

答案 2 :(得分:0)

使用NEWID()或ROW_NUMBER()

背后有不同的要求

例如,需要paging in SQL Row_Number()。 就像Row_Number()一样,NewID()函数也会为每个数据行提供唯一值的方法,但不会帮助您提供SQL分页,例如

每次执行查询时,NewID()都会返回同一行的不同数据。除非数据没有改变,否则Row_Number()更不一样