我们正在使用sqlservermanagementstudio将大容量数据插入到一个数据库表中。目前,我们所处的位置是将发送到数据库的数据添加到表中的特定行(这由存储过程控制)。我们发现,超时发生在操作完成之前;此时,由于while循环,我们认为操作很慢,但我们不确定如何编写更快的等效操作。

-- Insert statements for procedure here
WHILE @i < @nonexistingTblCount
BEGIN
    Insert into AlertRanking(MetricInstanceID,GreenThreshold,RedThreshold,AlertTypeID,MaxThreshold,MinThreshold)
    VALUES ((select id from @nonexistingTbl order by id OFFSET @i ROWS FETCH NEXT 1 ROWS ONLY), @greenThreshold, @redThreshold, @alertTypeID, @maxThreshold, @minThreshold)

    set @id = (SELECT ID FROM AlertRanking
    WHERE MetricInstanceID = (select id from @nonexistingTbl order by id OFFSET @i ROWS FETCH NEXT 1 ROWS ONLY)
    AND GreenThreshold = @greenThreshold
    AND RedThreshold = @redThreshold
    AND AlertTypeID = @alertTypeID);

    set @i = @i + 1;
END

其中@nonexistingTblCount是表@nonexistingTbl中的总行数。@nonexistingTbl表在前面声明,包含我们要添加到表中的所有值。

最佳答案

您应该能够用一条语句插入所有记录,而不是使用循环。

INSERT INTO AlertRanking(MetricInstanceID,GreenThreshold,RedThreshold,AlertTypeID,MaxThreshold,MinThreshold)
SELECT id, @greenThreshold, @redThreshold, @alertTypeID, @maxThreshold, @minThreshold FROM @nonexistingTbl ORDER BY id

10-04 19:29