Sql 为什么在视图中添加行数会花费太多时间来执行?

Sql 为什么在视图中添加行数会花费太多时间来执行?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果我在视图中使用NewID,则需要1毫秒 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' 但如果我用排号,完成的时间会太长 ALTER VIEW [dbo].[d] AS SELECT Row_number()OVER(

如果我在视图中使用NewID,则需要1毫秒

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' 
但如果我用排号,完成的时间会太长

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' 
我认为,
NEWID()
总是创建任意随机数作为ID(不需要任何计算),但是在
ROW\u number()
SQL的情况下,需要对列进行排序,然后提供ID。

由于
ROW\u NUMBER()
NEWID()
更复杂,SQL server需要更多的时间来处理它。

ROW\u NUMBER()
将有额外的结果排序成本,但
NEWID()
没有此成本
如果您查看执行计划,您可以看到相同的内容:

单击工具栏上的
Display Estimated Execution Plan
图标
SSMS

见下图


使用NEWID()或ROW_NUMBER()有不同的要求

例如,For是必需的。 与Row_Number()一样,NewID()函数也将为每个数据行提供唯一值的方法,但不会帮助您提供SQL分页


每次执行查询时,NewID()为同一行返回不同的数据。除非数据没有改变,否则我认为行号()的相同程度要小得多,因为
的顺序是按
。那个专栏有封面索引吗?@Raj那么解决办法是什么。检查答案。每个人都给了你完美的答案。如果需要使用
ROW\u NUMBER()
,则在
ORDER BY
中使用的列上创建索引将有所帮助,但无法与使用
NEWID()的速度相匹配