Sql server 在不同数据库上使用内部联接进行SQL更新
我正在尝试使用不同数据库中具有内部联接的另一个表中的数据更新表中的数据。数据量非常大,这导致执行时间超过10个小时,这让我觉得我的查询可能有问题Sql server 在不同数据库上使用内部联接进行SQL更新,sql-server,database,tsql,join,Sql Server,Database,Tsql,Join,我正在尝试使用不同数据库中具有内部联接的另一个表中的数据更新表中的数据。数据量非常大,这导致执行时间超过10个小时,这让我觉得我的查询可能有问题 UPDATE [Database1]..[Table1] SET [Database1]..[Table1].Table1BitValue = CASE WHEN ([Database2]..[Table2].Table2BitValue IS NULL OR [D
UPDATE [Database1]..[Table1]
SET [Database1]..[Table1].Table1BitValue =
CASE
WHEN ([Database2]..[Table2].Table2BitValue IS NULL
OR [Database2]..[Table2].Table2BitValue = 0)
THEN 0
ELSE 1
END
FROM [Database1]..[Table1]
INNER JOIN [Database2]..[Table2] ON [Database2]..[Table2].[Table2Id] = [Database1]..[Table1] .[Table1Id]
您需要稍微帮助优化器,如果可能的话,在远程表上添加一个过滤器。否则,它将回调远程表中的所有行以满足连接 以下是攻击它的其他一些方法:
您可以尝试分块更新表。 这样做的目的是避免由于大量行而锁定整个表
DECLARE @maxID INT,
@startRange INT,
@endRange INT,
@batchSize INT; -- keep below 5000 to be safe
SET @batchSize = 2000;
SET @startRange = 0;
SET @endRange = @batchSize;
SET @maxID = 1;
SELECT @maxID = max([Table1Id]) FROM [Database1]..[Table1]
BEGIN TRY
WHILE (@startRange < @maxID)
BEGIN
UPDATE [Database1]..[Table1]
SET [Database1]..[Table1].Table1BitValue =
CASE
WHEN ([Database2]..[Table2].Table2BitValue IS NULL
OR [Database2]..[Table2].Table2BitValue = 0)
THEN 0
ELSE 1
END
FROM [Database1]..[Table1]
INNER JOIN [Database2]..[Table2] ON [Database2]..[Table2].[Table2Id] = [Database1]..[Table1].[Table1Id]
WHERE [Database1]..[Table1].[Table1Id] BETWEEN @startRange AND @endRange;
SET @startRange = @endRange + 1;
SET @endRange = @endRange + @batchSize;
END;
END TRY
BEGIN CATCH
-- Add your code for: RAISERROR();
RETURN;
END CATCH;
这只是分块的概念,您可以根据需要进行修改。
尚未验证,请在执行上述脚本之前进行验证是否有执行计划如果是,post itI不实际,因为它仍在运行post两个表的索引详细信息在这种情况下,Table1BitValue或Table2BitValue上似乎没有索引id在两个表中都被索引我将在明天尝试此操作。我现在是怎么做的,花了24小时才完成,我不得不取消它,因为它太荒谬了。它几乎没有修改,查询在2小时30分钟左右完成。