【发布时间】:2011-07-23 01:28:55
【问题描述】:
我在 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,DATEADD(DD,-7,'01-09-2010'),
'04-09-2010',0,130,null,1, 0)
)
问题:这两种方法有很大区别吗?一个比另一个更快或更常见/标准?我认为声明更快,因为您定义了您要查找的列是什么。如果我省略那些列会更快吗?没有用于移动平均线的计算?(不确定这一点,因为无论如何它都必须获取所有行,尽管选择更少的列在直觉上会更快/更少)
我还从这里How to declare Internal table in MySQL? 找到了一个create temporary table @table,但我不希望该表在函数之外持续存在(我不确定创建临时表是否这样做。)
【问题讨论】:
-
这里有两个不需要临时表的运行平均值示例,您不妨尝试一下以提高性能:stackoverflow.com/questions/911326/…stackoverflow.com/questions/26618353/…
标签: sql performance tsql sql-server-2008