2017-12-13 6 views
1

私のSQL Server 2012データベースでは、レコードを取得してそれに応じて更新する必要がある2番目のSQL Serverデータベースへのリンクサーバー参照があります。SQL Serverのリンクされたサーバーのアップデート - ひどいパフォーマンス

UPDATE 
    Linked_Tbl 
SET 
    Transferred = 1 
FROM 
    MyLinkedServer.dbo.MyTable Linked_Tbl 
JOIN 
    MyTable Local_Tbl ON Local_Tbl.LinkedId = Linked_Tbl.Id 
JOIN 
    MyOtherTable Local_Tbl2 ON Local_Tbl.LocalId = Local_Tbl2.LocalId 

私はそれがまだ実行していたとして実行されているの時間後に停止しなければならなかった:

は、私が実行しようとしています次の更新ステートメントを持っています。

オンラインで、found solutionsを読んだことがあります。最適な解決策は、Linked Server自体にストアドプロシージャを作成して、ワイヤで実行するのではなく更新ステートメントを実行することです。私が持っている

問題は、次のとおりです。

  1. 私は他のサーバー上の任意の手順を作成する能力を持っていません。
  2. このプロシージャを作成することができたとしても、すべてのIDをストアドプロシージャに渡して更新する必要があり、何千ものIDを効率的に処理する方法がわかりません(明らかに、私は最初にその手順を作成することはできません)。

多くの場合、別のサーバーに変更を加える権限を持っていないということを考えれば、他の解決方法があると思います。

+0

ローカルでアップデートをローカルに送信する手順。あなたがこれを行うことができない場合は、リンクされたサーバーにRBARアップデートを取得しようとしています(私はこれを回避する方法はないと思います)。回避策があるとは思わないでください。あなたの#2に答えるには、リンクされたサーバーからIDを選択するほうが、リモート更新の一部として個々の行を個別に送信する方がはるかに効率的です。 –

+2

リモートサーバーでストアドプロシージャを作成する必要はありません。アップデートを含む動的SQLを使用するだけで、 'EXEC AT'でコードを実行するだけで、リモートサーバはすべてを行います。ここを見てください:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ec527f63-d454-4b8a-81e9-23a2ff54c1ca/execute-at-with-dynamic-linked-server-name?forum = transactsql – Alejandro

+0

@Alejandro、ありがとう、これはこの周りの唯一の真の方法のようです...私は巨大なファンではありませんが、この状況で与えられた最良の選択肢のようです。 –

答えて

-1

私はあなたが試して、それはより多くの性能を与えることができるかどうか、わからない:解決策はなく、ローカルサーバー上のソースを照会し、ターゲットサーバー上のプロシージャを作成すること間違いあり

UPDATE 
    Linked_Tbl 
    SET 
    Transferred = 1 
    FROM OPENDATASOURCE([MyLinkedServer],'select Id, LocalId,Transferred from remotedb.dbo.MyTable') AS Linked_Tbl 
    JOIN MyTable Local_Tbl 
    ON Local_Tbl.LinkedId = Linked_Tbl.Id 
    JOIN MyOtherTable Local_Tbl2 
    ON Local_Tbl.LocalId = Local_Tbl2.LocalId 
関連する問題