2011-01-17 8 views
3

サーバー(ServerA)で実行されているSQLスクリプトがあります このサーバーにはリンクサーバーが設定されています(ServerB) - これはデータセンターのサイト外にあります。リンクサーバーを使用した非常に遅いSQLアップデート

このクエリは、比較的speeidily作品:このクエリを使用して、同じテーブルを更新する際に

SELECT OrderID 
FROM [ServerB].[DBName].[dbo].[MyTable] 
WHERE Transferred = 0 

はしかし、:

UPDATE [ServerB].[DBName].[dbo].[MyTable] 
SET Transferred = 1 

それだけで1カラムがあります場合でも、どこ(完了するために、> 1分かかります転送済み= 0)

これはゆっくりと動作する理由はありますか? MyTableに「転送済み」列のインデックスを付ける必要がありますか?

+1

ちょっと考えました。あなたは 'where = transferred'をupdateステートメントに追加しようとしましたか?それが違いを生むかどうかはわかりません。また、2つのクエリの実行計画を見てみましょう。 – Blorgbeard

答えて

8

あなたは(私はSQLサーバーを意味する)のレコードを選択するために、リモート側でインデックスを使用できない場合は、実際には、このようなリモートアップデートは、リモート側からのすべてのレコード(主キーとその他の必要なフィールド)を読み取り、ローカルにこれらを更新し、バックレコードを更新送ります。あなたのリンクが遅い場合(例えば10Mbit/s以下)、このシナリオには多くの時間がかかります。

私は、リモート側でのストアドプロシージャを使用しました - あなただけ(オプションパラメータのセットで)リモートからそのプロシージャを呼び出す必要があり、このように。更新可能なサブセットが小さい場合は、適切なインデックスも役立ちますが、通常、ストアドプロシージャは高速です。

+0

ありがとう、これは私が(SPリモート側を作成した) – Alex

3
UPDATE [ServerB].[DBName].[dbo].[MyTable] 
SET Transferred = 1 
WHERE Transferred = 0 -- missing this condition? 
+0

同じ問題はありません。私は文字通り「= 1転送UPDATEテーブルSET」を試してみましたが、それは2分間かけをとり、「本物」のクエリは、私は、これが問題かもしれ思った一時的な卓上への参加を持って、この質問の目的のために私のクエリを簡素化完了するために! – Alex

+0

ジョインには、リモートdbでアクセスする必要があるレコードを削減するフィルタが含まれている可能性があります。句が...テーブル全体を更新し、取る無いと更新のに対し、テーブル内のレコードがある限りです。大きなテーブル=長い更新。 – RichardTheKiwi

+0

私はあなたが投稿正確なクエリを実行し、言ったように、正確に実行するために同じ時間がかかります。 – Alex

0

このテーブルはどのくらいの頻度で使用されていますか?

多くのユーザーがこのテーブルを同時に使用すると、ロック/ブロックに問題が発生する可能性があります。

レコードをフィルタリングせずにテーブルを更新するプロセスがあると、テーブル全体がトランザクションによってロックされ、テーブルを更新する必要がある他のプロセスが待機します。

このケースでは、テーブルのロックを解除するために他のプロセスが待っている可能性があります。

関連する問題