2009-06-30 45 views
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) 

编辑:

此外,反正是有,我可以压缩/ ZIP被发送的数据来回?

回答

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 docsOUTPUT docs了解详情。

或许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 
+0

对不起,忘了提及这一点。 INSERT是可以忍受的。它的更新速度很慢。你说得对,我正在减少流量。不幸的是我不能测试你的脚本,因为我现在只是走出去办公室。但是,谢谢你的贡献。我会明天尝试并发布我的结果。 – super9 2009-06-30 19:06:56

+0

您最初从远程服务器中抽取了Date IS NULL的行,但随后您为DateCollected为NULL的行更新了Date列。这意味着您可以在本地插入一组不同的行,而不是更新。这是故意的吗? – 2009-06-30 22:44:28

0

似乎更新已超过拉动整个远程表,扫描记录,并做了嵌套抬头看看@ temp1中,船返回更新。它只是一个猜测,没有更多的附加信息。您应该查看实际的执行计划并追踪所花费的时间。同样使用STATISTICS IO ON可能会有所帮助。

这真的只是在黑暗中拍摄,但也许你可以尝试加入,而不是存在:

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();