2014-11-08 87 views
1

我需要做一些统计数字不可与结果SQL服务器:我如何才能优化这个查询100000个查询+

我需要检查每第二个在三年内,如果条件满足,然后插入一个新表结果。

我可以使用秒表(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

如果表上的本机数据类型是DateTime,我想我会避免在While循环的每次迭代中对函数进行整数转换。

将一个索引放在DateTime字段和任何你需要计数的字段上。如果您需要使用while循环,请在其本机数据类型的索引字段上执行。将变量更改为DateTime并执行DATEADD(SECOND,1,@i)

调用该函数很可能会增加开销,即使其函数很小。标量函数未知其优化。如果您需要Unix TimeStamp,也许换一种方式并为DateTime创建一个Unix Timestamp函数。或者构建一个映射表来执行DateTime和UnixTimeStamp字段,并将您的Table2连接到映射表以获取特定值。

您完全可以避免使用while循环,只需拾取完整的结果集并批量插入即可。