0

以下のコードは正常に機能しますが、実行するには絶対的な時間がかかります。どうすればこれをスピードアップできますか?

背景:ローカルサーバーをリモートサーバーにリンクしました。ローカルサーバーから、リモートサーバーからローカルサーバーにデータを挿入してから、リモートサーバーのテーブルを更新する必要があります。正確な詳細については、スニペットを参照してください。

DECLARE @temp1 TABLE
(LoginID INT PRIMARY KEY, 
UserID UNIQUEIDENTIFIER, 
Message NCHAR(1000))

INSERT INTO [My Local Server].[DB Name].dbo.Login 
(LoginID, UserID, Message)
OUTPUT INSERTED.LoginID, INSERTED.UserID, INSERTED.Message INTO @temp1
SELECT LoginID, UserID, Message
FROM [Remote Server].[Remote DB Name].dbo.Login2 
WHERE Date IS NULL

UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
SET Date = GETDATE()
FROM [Remote Server].[Remote DB Name].dbo.Login2 AS z
WHERE EXISTS (SELECT 1 FROM @temp1 AS x WHERE z.Date IS NULL AND x.LoginID = z.LoginID)

編集:

さらに、送信されるデータを圧縮/圧縮することはできますか?

4

2 に答える 2

2

INSERTまたはUPDATEが原因ですか、それとも両方とも悪いですか?

リモートサーバーからDateの値がNULLの行を取得し、それらの値をUPDATEステートメントで再度送信します。更新された行を選択してローカルに挿入することで、トラフィックを節約できる可能性があります。次のように言うことで、これを実行できるようです(申し訳ありませんが、テストできるMS SQL Serverはありません)。

INSERT INTO [My Local Server].[DB Name].dbo.Login 
(LoginID, UserID, Message)
SELECT *
FROM
  UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
  SET Date = GETDATE()
  OUTPUT LoginID, UserID, Message
  WHERE Date IS NULL

詳細については、MSDNのINSERTドキュメントOUTPUTドキュメントを参照してください。

または多分OUTPUTINTOは行く方法です:

UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
SET Date = GETDATE()
OUTPUT LoginID, UserID, Message
INTO [My Local Server].[DB Name].dbo.Login (LoginID, UserID, Message)
WHERE Date IS NULL
于 2009-06-30T18:39:26.027 に答える
0

UPDATEは、リモートテーブル全体をプルし、レコードをスキャンして、@ temp1をネストされたルックアップを実行し、更新を返送する必要があるようです。それは単なる推測であり、追加情報はありません。実際の実行計画を確認し、費やした時間を追跡する必要があります。また、STATISTICSIONを使用すると役立つ場合があります。

これは実際には暗闇の中でのショットですが、EXISTSの代わりに参加を試すことができます。

WITH cte_remote AS (
  SELECT z.Date
    FROM [Remote Server].[Remote DB Name].dbo.Login2 AS z
    JOIN @temp1 AS x ON z.DateCollected IS NULL AND x.LoginID = z.LoginID)
UPDATE cte_remote 
    SET Date = GETDATE();
于 2009-06-30T19:54:27.940 に答える