下面的代码运行正常,但运行时需要绝对年龄。我怎样才能加快速度呢?
背景:我已将本地服务器链接到远程服务器。从我的本地服务器,我需要将数据从远程服务器插入我的本地服务器,然后更新我的远程服务器上的表。有关详细信息,请参阅代码段。
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)
编辑:
另外,无论如何我可以压缩/压缩来回发送的数据吗?
答案 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 docs和OUTPUT 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();