循环列值并插入到另一个表中

问题描述 投票:0回答:1

我有以下伪代码,想知道我是否正确处理它。背景是我有一个表,其中约有 1.38 亿行,我想通过一组分组变量来聚合某些特定列。我想在代表快照日期的 [Timestamp] 列上执行此操作。每个快照大约有 400 万行。

DECLARE @Timestamp DATETIME;

DECLARE cursor_name CURSOR FOR SELECT [Timestamp] FROM dbo.my_table;

OPEN cursor_name;

FETCH NEXT FROM cursor_name INTO @Timestamp;

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT A.[Timestamp],
        A.Column2,
        A.Colmn_N,
        [agg_val_1] = ...,
        [agg_val_n] = ...
    INTO dbo.my_aggregate_tbl
    FROM dbo.my_table AS A
    WHERE A.Timestamp = @Timestamp
    GROUP BY A.[Timestamp],
        A.Column2,
        A.Column_N;

    FETCH NEXT FROM cursor_name INTO @Timestamp;
END

CLOSE cursor_name;

DEALLOCATE cursor_name;

我有可行的方法来实现这一目标吗?大约有 30 个不同的时间戳。

sql-server
1个回答
0
投票

让我们假设您的常规聚合代码速度慢的原因是没有足够的内存来一次执行整个操作,并且您正在按时间戳进行批处理操作。

首先,您需要获取光标的

DISTINCT timestamp
代码,即。
DECLARE cursor_name CURSOR READ_ONLY FORWARD_ONLY LOCAL STATIC FOR SELECT DISTINCT [Timestamp] FROM dbo.my_table;
否则会一直循环下去。

然后,您需要避免

INTO dbo.my_aggregate_tbl
,因为它会在第二次循环迭代时崩溃。最好通过 CREATE TABLE ... 创建 my_aggregate_tbl ...然后插入其中。

最后,我仍然认为直接聚合代码会击败光标,因为这将只使用一次扫描,但也许你有时间戳索引但没有足够的内存,在这种情况下,它可能会工作。

© www.soinside.com 2019 - 2024. All rights reserved.