2013-09-27 67 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