1

这真让我抓狂。我有一个 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 数据库。

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

小号

4

1 回答 1

0

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

就我的经验而言,"WHILE"它本身也很慢。一会儿做数据修改,就是让引擎在插入之前启动一个事务,然后进行插入和传输数据,最后关闭事务并释放所有分配的资源。您强制引擎不要在关闭和操作开始之间等待。我应该建议你"WAIT FOR DELAY"在 while 结束前使用几毫秒的值,插入完成后,它不会让引擎喘不过气来!

干杯

于 2012-10-29T20:53:15.950 回答