包含来自链接服务器的插入的WHILE循环逐渐变慢

时间:2012-10-29 20:32:33

标签: sql while-loop linked-server

这让我发疯了。我有一个WHILE循环,从链接的服务器抓取1行并将其放入本地表。逻辑工作正常,但循环减慢了处理的行数越来越多。

SELECT @max_id = MAX(id), @min_id = MIN(id)
FROM #ids
    WHILE @min_id <= @max_id
    BEGIN
        SET @sql = 'SELECT row1, row2, row3 FROM [Linked Server Table]'

        INSERT INTO [Local Table]
        (row1 ,row2, row3)
        EXEC(@sql)

        SELECT @min_id = MIN(id)
        FROM #id
        WHERE id > @min_id
    END

感觉就像是某种东西在记忆中积聚并使其减速但我不知道是什么。

到目前为止,我已尝试过: -

将INSERT转换为SP

每100行添加一个CHECKPOINT

将恢复模式更改为简单

将链接服务器行插入临时表或表变量

除了PK之外,本地表上没有索引。 链接服务器是Atomix数据库。

任何人都可以提出任何理由,为什么这会越来越慢?

取值

1 个答案:

答案 0 :(得分:0)

在我看来,在数据库引擎和远程链接服务器之间传输网络流量可能是质量问题。我强烈建议您使用"TOP"子句限制链接服务器中的select子句,这意味着较小的包从网络中检索,因此质量差对速度的影响较小。

就我的经验而言,"WHILE"本身也很慢。在一段时间内进行数据修改意味着您在引入之前将引擎置于启动事务,之后执行插入和传输数据,最后关闭事务并释放所有分配的资源。您强制引擎在关闭和操作开始之间不要等待。我建议你使用"WAIT FOR DELAY",在结束之前放置几毫秒的值,插入完成后,它不会让引擎的呼吸消失!

干杯