sql – 使用vs声明一个临时表:性能/差异?

前端之家收集整理的这篇文章主要介绍了sql – 使用vs声明一个临时表:性能/差异?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在sqlServer 2008中创建了一个sql函数,该函数声明了一个临时表,并使用它来计算内部值的移动平均值
declare @tempTable table 
    (
        GeogType nvarchar(5),GeogValue nvarchar(7),dtAdmission date,timeInterval int,fromTime nvarchar(5),toTime nvarchar(5),EDSyndromeID tinyint,nVisits int
    )
insert @tempTable select * from aces.dbo.fEDVisitCounts(@geogType,@hospID,DATEADD(DD,-@windowDays + 1,@fromDate),@toDate,@minAge,@maxAge,@gender,@nIntervalsPerDay,@nSyndromeID)


    INSERT @table (dtAdmission,EDSyndromeID,MovingAvg) 
    SELECT list.dtadmission,@nSyndromeID,AVG(data.nVisits) as MovingAvg
    from @tempTable as list 
        inner join @tempTable as data  
    ON list.dtAdmission between data.dtAdmission and DATEADD(DD,@windowDays - 1,data.dtAdmission) 
    where list.dtAdmission >= @fromDate
    GROUP BY list.dtAdmission

但是我也发现你可以这样声明tempTable:

with tempTable as 
(
    select * from aces.dbo.fEDVisitCounts('ALL',null,-7,'01-09-2010'),'04-09-2010',130,1,0)
)

问题:这两种方法有很大差异吗?比其他或更常见/标准更快吗?我会认为声明更快,因为你定义了你正在寻找的列是什么.如果我忽略了在移动平均线的计算中没有使用的列,还会更快吗?(不确定这个因为它必须得到所有的行,尽管选择较少的列使直观的意义,它会更快/更少做)

我也从这里找到一个创建临时表@table,但是我不希望该表在该函数之外持久化(我不知道创建临时表是否这样做).

解决方法

@table语法创建一个表变量(tempdb中的一个实际表),并将结果实现到它.

WITH语法定义了一个没有实现的Common Table Expression,只是一个内联的View.

大多数时候你最好使用第二个选项.你提到这是一个功能.如果这是一个TVF,那么大多数时候你希望这些内联而不是多个语句,所以它们可以被优化器扩展 – 这将立即禁止使用表变量.

有时候(说底层查询是昂贵的,你想避免多次执行),你可能会认为实现中间结果可以提高某些特定情况下的性能.有currently no way强制为CTE(without forcing a plan guide at least)

在这种情况下,你(一般)有3个选择.一个@tablevariable,#localtemp表和一个## globaltemp表.但是,只有第一个允许在函数内部使用.

有关表变量和#temp表see here之间的差异的更多信息.

猜你在找的MsSQL相关文章