2013-09-27 90 views
0

我有一個表: VIEWING_17to31_aug_server其中有393085432行。while循環或動態執行

我試圖通過連接條件更新字段(連接條件正確)。但是查詢無法執行,因爲它超出了查詢的臨時空間。

然後我試圖使用while循環,但沒有中斷,但現在已經運行了很多年。

CREATE VARIABLE @var_period_start    datetime; 
CREATE VARIABLE @var_period_end     datetime; 
CREATE VARIABLE @scanning_day     datetime; 

SET @var_period_start = '2013-08-17'; 
SET @var_period_end = '2013-08-31'; 
SET @scanning_day = @var_period_start; 

while @scanning_day <= dateadd(dd,0,@var_period_end) 
begin 
    UPDATE VIEWING_17to31_aug_server 
    SET A.calculated_scaling_weight = B.calculated_scaling_weight 
    FROM VIEWING_17to31_aug_server AS A 
    LEFT JOIN sk_prod.viq_viewing_data_scaling AS B 
    ON A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER 
    AND A.VIEWING_DAY = B.ADJUSTED_EVENT_START_DATE_VESPA 
    AND A.VIEWING_DAY = @SCANNING_DAY 
End 

有什麼其他的方法可以讓它更快完成嗎?動態執行會有幫助嗎?

+0

不知道是否可以與您的應用程序適合,但如果你可以考慮每次更新原子(例如,如果while循環失敗,你希望保留更新已經完成),那麼你可以在每個循環週期後嘗試一次提交。 – asantaballa

+0

謝謝你這個@asantaballa – SouravD

回答

1

我認爲你需要在循環內增加@scanning_day,因爲while條件將永遠不會被滿足,因爲@scanning_day保持不變,因爲@var_period_start。例如

SET @scanning_day = dateadd(dd, 1, @scanning_day); 

所以,你的完整劇本,將成爲:

CREATE VARIABLE @var_period_start    datetime; 
CREATE VARIABLE @var_period_end     datetime; 
CREATE VARIABLE @scanning_day     datetime; 

SET @var_period_start = '2013-08-17'; 
SET @var_period_end = '2013-08-31'; 
SET @scanning_day = @var_period_start; 

while @scanning_day <= dateadd(dd,0,@var_period_end) 
begin 
    UPDATE VIEWING_17to31_aug_server 
    SET A.calculated_scaling_weight = B.calculated_scaling_weight 
    FROM VIEWING_17to31_aug_server AS A 
    LEFT JOIN sk_prod.viq_viewing_data_scaling AS B 
    ON A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER 
    AND A.VIEWING_DAY = B.ADJUSTED_EVENT_START_DATE_VESPA 
    AND A.VIEWING_DAY = @SCANNING_DAY; 

    SET @scanning_day = dateadd(dd, 1, @scanning_day); 
End 
+0

這真的很有幫助。謝謝@garethD – SouravD