【问题标题】:How can I run this UPDATE query faster?如何更快地运行此 UPDATE 查询?
【发布时间】:2016-04-15 12:30:46
【问题描述】:
UPDATE 
    WEB 
SET 
    WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
FROM 
    dbo.F_SUPPORT_WEB WEB
INNER JOIN 
    dbo.D_SUPPORT DIM 
    ON WEB.id_support = DIM.id_support 
    AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)

我在下面有这个查询,表 F_SUPPORT_WEB 中有 3 亿行要更新,我无法运行它,每次我都会遇到事务日志问题。 我认为 between 运算符是关键,但我不知道如何优化它。

有人可以帮我吗?

【问题讨论】:

  • 网络上有多少索引?您可能需要禁用索引,并在更新后强制它们刷新。
  • 只有一个索引..
  • 人们不会期望遇到事务日志问题,因此解决这个问题可能是一个好主意。你有什么问题?
  • 您尝试更新多少行?这可能只是一个数据量问题。
  • 什么是“事务日志问题”?

标签: sql sql-server-2008-r2 sql-update inner-join between


【解决方案1】:

如果您的日志表驱动器不足以支持单个事务,则需要将其分解为多个事务。我遇到了类似的问题并进行了测试,直到找到了最佳位置(为我更新了 100,000 行)。继续循环,直到所有记录都完成。您可以通过简单地修改查询来做到这一点。

UPDATE WEB 
SET WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
FROM dbo.F_SUPPORT_WEB WEB
INNER JOIN dbo.D_SUPPORT DIM ON WEB.id_support = DIM.id_support 
   AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)
WHERE WEB.ID_D_SUPPORT <> DIM.ID_D_SUPPORT 

您可能希望首先将其添加到哪里,以查看是否更新了不必要的记录。

【讨论】:

  • 谢谢,“哪里”改变了一切! (y)
  • @imanebz 太棒了!如果您的场景有可能,请不要忘记检查 NULL。
【解决方案2】:

您需要循环运行更新。当您尝试一次更新所有这些记录时,它必须将所有这些记录复制到事务日志以防出错,以便回滚更改。如果您进行批量更新,则不会遇到该问题。见下文

SELECT 1 --Just to get a @@ROWCOUNT established
WHILE (@@ROWCOUNT > 0)
BEGIN
    UPDATE TOP (5000000) WEB --Change this number to however many you want to update at a time
    SET WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
    FROM dbo.F_SUPPORT_WEB WEB
    INNER JOIN dbo.D_SUPPORT DIM ON WEB.id_support = DIM.id_support 
               AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)
    WHERE WEB.ID_D_SUPPORT != DIM.ID_D_SUPPORT --Don't update records that have already been updated, otherwise the loop will run forever
END

【讨论】:

    【解决方案3】:
    1. 使用 dim.ids 创建临时表 Dim。
    2. 使用 DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid 仅将带有 id 的临时表 DIM 批量插入。
    3. 在没有(WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)的情况下与临时表建立连接

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 2011-09-25
      • 2011-06-04
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多