2014-11-08 75 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循環,只需拾取完整的結果集並批量插入即可。