我需要做一些统计数据,这些统计数据将创建一个包含结果的新表
如果符合条件,我需要在三年内检查每一秒,然后插入结果。
我可以使用带有秒(unixtimestamp)的现成表或某种类型的自联接来更有效地执行此操作吗?
DECLARE @i int = 1356999800
WHILE @i < 1356999900
BEGIN
insert into tablexxx (unixtimestamp, unit, activated, datum)
select
@i as unixtimastamp, '243-1080' as unit,
count(*) as activated,
dbo.UNIX_TIMESTAMP_TO_DATETIME(@i) as datum
from
table2
where
table2.date <= dbo.UNIX_TIMESTAMP_TO_DATETIME(@i)
and table2.date2 >= dbo.UNIX_TIMESTAMP_TO_DATETIME(@i)
答案 0 :(得分:0)
如果表上的本机数据类型是DateTime,我想我会避免在While循环的每次迭代中对函数进行整数转换。
在DateTime字段和您需要计算的任何字段上放置索引。如果需要使用while循环,请在其本机数据类型的索引字段上执行此操作。将变量更改为DateTime并执行DATEADD(SECOND,1,@ i)
调用该函数很可能会增加开销,即使它的函数很小。标量函数的优化并不为人所知。如果你需要Unix TimeStamp,也许可以采用另一种方式为DateTime建立一个函数到Unix时间戳。或构建一个映射表来执行DateTime和UnixTimeStamp字段并将Table2加入到映射表中以获取特定值。
您可以完全避免使用while循环,只需拾取完整的结果集并批量插入。