【问题标题】:SQL Update From Table Prevent Duplicates Performance从表中更新 SQL 防止重复性能
【发布时间】:2018-01-03 21:20:40
【问题描述】:

我正在尝试使用其他两个表中的键更新连接表。连接表 (TableC) 已经填充了来自 TableA 的数百万个键。以下查询在不到两分钟的时间内更新了所有行(非常可接受);但是,如果存在类似的行,则每一行都应唯一匹配。 (TableB 中的键不应在 TableC 中重复 - TableA 中的每条记录都应与 TableB 中的唯一记录匹配。)

UPDATE TableC
SET TableC.TableBkey = b.TableBkey
FROM TableC AS c
INNER JOIN TableA AS a ON a.TableAkey = c.TableAkey
INNER JOIN TableB AS b ON b.col1 = a.col1 AND b.col2 = a.col2 AND b.col3 = a.col3
WHERE c.TableBkey IS NULL

这使得查询无限期地运行而不更新任何记录;可能连接无法完成。

AND NOT EXISTS (SELECT TOP 1 TableBkey FROM TableC AS x WHERE x.TableBkey = b.TableBkey)

是否有任何其他方法可以限制 TableB 中的重复键而不影响性能?我不想使用触发器。

【问题讨论】:

  • 您查看过查询的执行计划吗?哪里被屏蔽了?索引的状态是什么?
  • 如果b.TableBkey 已经存在于TableC 列TableBkey 中,您的意思是不应该更新为TableC.TableBkey?
  • 如何将tableB 替换为在tableB 中查找记录的子查询,而tableBkey 不在tableC.tableBkey 中?使用左外连接获取连接的补集。 stackoverflow.com/questions/25849807/…
  • 如果目标中有重复的匹配键,那么如果您运行此更新查询两次,它将在每种情况下更新任意记录。如果您每次只尝试更新多个可能匹配项中的一个,是的,这会发生,但是每次运行更新时,它都会选择一个任意匹配项。
  • 谢谢@Nick.McDermaid。没有重复的键,只有相似的记录。如果三列匹配,则匹配哪些键并不重要,只要它们一对一匹配即可。

标签: sql sqlperformance


【解决方案1】:

试试这个:

UPDATE TableC
SET TableC.TableBkey = b.TableBkey
FROM TableC AS c
INNER JOIN TableA AS a ON a.TableAkey = c.TableAkey
INNER JOIN (select * from TableB 
            LEFT JOIN TableC ON TableB.tableBkey = TableC.tableBkey
            WHERE TableC.TableBkey is null )
AS b ON b.col1 = a.col1 AND b.col2 = a.col2 AND b.col3 = a.col3
WHERE c.TableBkey IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多