1

これは私を夢中にさせています。リンクサーバーから1行を取得してローカルテーブルにドロップするWHILEループがあります。ロジックは正常に機能しますが、処理される行が増えるとループが遅くなります。

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 データベースです。

これがますます遅くなる理由を誰かが提案できますか?

S

4

1 に答える 1

0

私の見解では、データベース エンジンとリモート リンク サーバーの間でネットワーク トラフィックを送信する際の品質の問題になる可能性があります。リンクされたサーバーからselect句を使用する句を制限することを強くお勧めします。"TOP"これは、ネットワークから取得する小さなパッケージを意味するため、品質が悪いと速度が低下する可能性があります。

また、私の経験によると、"WHILE"それ自体が当然遅いです。しばらくしてデータの変更を行うということは、エンジンを挿入の前にトランザクションを開始するように配置し、その後、データの挿入と転送を行い、最後にトランザクションを閉じて、割り当てられたすべてのリソースを解放することを意味します。エンジンが閉じてから操作が開始されるまで待機しないように強制します。"WAIT FOR DELAY"挿入が完了した後、エンジンの息を吹き飛ばすことはありません!

乾杯

于 2012-10-29T20:53:15.950 に答える