Mik*_*ike 16 sql t-sql performance sql-server-2008
我在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
Run Code Online (Sandbox Code Playgroud)
但我也发现你可以像这样声明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)
)
Run Code Online (Sandbox Code Playgroud)
问题:这两种方法有很大不同吗?一个比另一个更快还是更普通/标准?我认为声明更快,因为你定义了你正在寻找的列是什么..如果我要省略在移动平均线的计算中没有使用的列,它会更快吗?(不确定这个因为它必须无论如何都要获得所有行,尽管选择较少的列会让人觉得它会更快/更少.
我也create temporary table @table从这里找到了如何在MySQL中声明内部表?但我不希望表在函数外部持久存在(我不确定创建临时表是否执行此操作.)
Mar*_*ith 28
的@table语法创建一个表变量(在实际的表tempdb),并将结果物化到它.
该WITH语法定义了一个公共表表达式未兑现而仅仅是一个内嵌视图.
大多数情况下,您最好使用第二个选项.你提到这是一个功能.如果这是一个TVF,那么大多数时候你希望它们是内联而不是多语句,这样它们就可以被优化器扩展 - 这会立即禁止使用表变量.
但有时(假设基础查询很昂贵,并且您希望避免多次执行),您可能会确定实现中间结果会在某些特定情况下提高性能.有目前还没有办法迫使这对热膨胀系数的(没有至少迫使计划指南)
在这种情况下,您(通常)有3个选项.A @tablevariable,#localtemp桌子和##globaltemp桌子.但是,只有第一个允许在函数内使用.
有关表变量和#temp表之间差异的更多信息,请参见此处.
SQL*_*ace 11
除了马丁回答的问题
;with tempTable as
(
select * from aces.dbo.fEDVisitCounts('ALL', null,DATEADD(DD,-7,'01-09-2010'),
'04-09-2010',0,130,null,1, 0)
)
SELECT * FROM tempTable
Run Code Online (Sandbox Code Playgroud)
也可以这样写
SELECT * FROM
(
select * from aces.dbo.fEDVisitCounts('ALL', null,DATEADD(DD,-7,'01-09-2010'),
'04-09-2010',0,130,null,1, 0)
) AS tempTable --now you can join here with other tables
Run Code Online (Sandbox Code Playgroud)