【问题标题】:sql server - efficient way to update table from joinsql server - 从联接更新表的有效方法
【发布时间】:2020-06-17 04:02:31
【问题描述】:

我需要从 suppTB 表更新 ordersTB 表上的 suppID 列。如下表:

suppTB

suppID ,suppName , itemID ,....

ordersTB

itemID, suppID(added later so mostly null's)...

更新此表的最有效方法是什么。我从旧 Q 的这里 (How can I do an UPDATE statement with JOIN in SQL?) 尝试了这个查询,但它执行了一天并且仍在运行

UPDATE ordersTB
SET A.suppID = B.suppID
FROM  ordersTB as A
JOIN  suppTB as B
    ON A.itemID = B.itemID
WHERE A.suppID is null

我尝试过的其他笔记和事情:

  • 两个表都很大(数千万)
  • itemID 和 suppID 列已编入索引。我在更新之前删除了索引以使其更快。仍然需要很长时间。
  • 还可以尝试 MERGE 查询。相同的结果..

【问题讨论】:

  • 你确定你的 SQL 是正确的吗?你告诉它你想更新 ordersTB 但这个表/别名没有出现在 FROM 之后的查询部分中
  • 你说得对,我在这里写的东西已经磨损了,我只是复制了正确的查询
  • 发布您的计划输出。还要告诉我们,如果您将 `UPDATE...SET ...` 替换为 `SELECT * FROM,查询是否有效
  • 这引出了一个问题——为什么在两个表中都保留suppIdItemId 不足以识别每个项目的正确 SuppId 吗?
  • #Caius:我的计划很简单,从另一个表更新表。在 db 可用后,我会尝试测试 SELECT 查询的建议(仍然取消长期更新查询)。 #Zohar:这些表上有更多的列依赖于它。我也需要以这种方式更新更多表格,所以我很好奇什么是有效的方法。如果这只有那些表和列你可能是对的!

标签: sql sql-server tsql join sql-update


【解决方案1】:

更新大量行的成本很高。首先要检查的是您是否只更新每一行一次:

select s.item_ID, count(*)
from suppTB s
group by s.item_ID
having count(*) > 1
order by count(*) desc;

如果这返回任何行,那么您对同一行有多个更新。这是一个性能打击。您应该修复业务逻辑。但是您可以在每一行中放置任意匹配值:

UPDATE o
SET suppID = s.suppID
FROM ordersTB o CROSS APPLY
     (SELECT TOP (1) s.*
      FROM suppTB s
      WHERE o.itemID = s.itemID
     )
WHERE o.suppID is null;

如果这不能解决问题,您可能需要重新加载表。逻辑是这样的:

select . . . , -- all columns except suppId
       s.suppId
into temp_ordersTb
from ordersTb o left join
     suppTb s
     on o.itemID = s.itemID;

truncate table ordersTb;

insert into ordersTb (. . .)
    select . . .
    from temp_ordersTb;

当然,请确保在尝试此操作之前备份您的表!

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 2010-10-12
    • 2011-03-03
    • 2016-03-16
    • 2012-01-23
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多