分布式查询的性能问题

时间:2009-06-30 18:15:14

标签: sql-server sql-server-2005 linked-server

下面的代码运行正常,但运行时需要绝对年龄。我怎样才能加快速度呢?

背景:我已将本地服务器链接到远程服务器。从我的本地服务器,我需要将数据从远程服务器插入我的本地服务器,然后更新我的远程服务器上的表。有关详细信息,请参阅代码段。

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)

编辑:

另外,无论如何我可以压缩/压缩来回发送的数据吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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();