0

the code below works fine but it takes an absolute age to run. How can I speed this up?

Background: I have linked my local server to my remote server. From my local server, I need to insert data from the remote server into my local server and then update the table on my remote server. See snippet for the exact details.

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)

EDIT:

In addition, is there anyway I can compress/zip the data being sent back and forth?

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 文档

或者也许 OUTPUT INTO 是要走的路:

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,然后将更新运回。它只是一个猜测,没有更多的附加信息。您应该查看实际的执行计划并跟踪花费的时间。也使用 STATISTICS IO ON 可能会有所帮助。

这实际上只是在黑暗中拍摄,但也许您可以尝试加入而不是 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 回答