【问题标题】:SQL Update with Inner Join on different databases在不同数据库上使用内部联接进行 SQL 更新
【发布时间】:2018-01-05 07:07:33
【问题描述】:

我正在尝试使用来自具有内部联接的不同数据库中另一个表的数据来更新表中的数据。数据量很大,这导致执行时间超过 10 小时,这让我觉得我的查询可能有问题。

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]

【问题讨论】:

  • 你有执行计划吗,如果有,贴出来
  • 我实际上并没有,因为它仍在运行
  • 发布两个表的索引详情
  • 在这种情况下,Table1BitValue 或 Table2BitValue 上似乎没有索引
  • 两个表中的 id 都有索引

标签: sql-server database tsql join


【解决方案1】:

您可以尝试分块更新表格。 想法是避免由于行数过多而锁定整个表

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;

这只是分块的想法,你可以根据自己的需要进行修改。 尚未验证,请在执行上述脚本前验证

【讨论】:

  • 我明天会试试这个。我是怎么做到的,现在花了 24 小时,但没有完成,我不得不取消它,因为它变得荒谬。
  • 它几乎没有修改,查询在大约 2 小时 30 分钟完成。
【解决方案2】:

如果可能,您需要帮助优化器并在远程表上放置一个过滤器。否则它将拉回远程表中的所有行以满足连接。

这里有一些其他的攻击方式:

https://blogs.technet.microsoft.com/pfelatam/2011/09/07/linked-server-behavior-when-used-on-join-clauses/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2012-10-04
    • 2011-12-23
    • 1970-01-01
    • 2019-06-25
    • 2013-07-31
    相关资源
    最近更新 更多