【问题标题】:Performance of incremental update of SQL table - different approachesSQL表增量更新的性能-不同的方法
【发布时间】:2015-02-03 16:18:46
【问题描述】:

我想只使用来自 table2 的新记录对 table1 进行增量更新。我正在寻找最快的方法。假设 id 是唯一整数,这三种方法中哪一种最快?如果您可以提出任何其他方法,请分享。

解决方案 1。

INSERT INTO table1 
SELECT * FROM table2 
WHERE NOT EXISTS 
    (SELECT 1 FROM table1 
    WHERE table2.id = table1.id)

解决方案 2。

INSERT INTO table1 
SELECT table1.* FROM table1 
LEFT OUTER JOIN table2
    ON table1.id = table2.id
    WHERE table2.id IS NULL

解决方案 3。

INSERT INTO table1 
SELECT * FROM table2 
    WHERE table2.id > (SELECT MAX([table1.id]) FROM table1)

【问题讨论】:

  • 1) ORDER BY 子句要么在这里什么都不做,要么产生错误。 2) 解决方案 3 对 MAX 的使用对我来说看起来不正确,无论如何在逻辑上与解决方案 1 和 2 有很大不同,因此无法比较。 3) 解决方案 1 和 2 在逻辑上是相同的,并且很可能会产生相同的执行计划和几乎相同的性能。

标签: sql join insert sql-server-2012


【解决方案1】:

第三种解决方案比前两种解决方案快得多。不过要小心。它可能返回与解决方案 1 和解决方案 2 不同的结果。

如果您想使用第三种解决方案,请确保 table2 中的新 id 始终获得比旧解决方案更高的数字。您可以对两个表中的记录编号进行检查。我还建议在 table1 中索引 id。

【讨论】:

    【解决方案2】:
    insert into table1 
    select table2.* from from table2 left outer join table1 on table2.id = table1.id
    where table1.id is null
    

    【讨论】:

    • 不是和解决方案nr 2一样吗?
    • 稍微解释一下会很有帮助。这如何回答哪个最快的问题?
    • 我相信 Mohammed 正在纠正您在解决方案 2 中的错字,即您想要表 2 中不在表 1 中的记录。就个人而言.. 我会使用解决方案 2,但出于我自己的好奇心,我会测试在测试机器上的性能
    • 不正确,子查询在 SQL Server、性能或任何其他方面都不会“suck”。事实上,您的外连接查询和相应的基于子查询的查询极有可能产生相同的执行计划。
    猜你喜欢
    • 2019-02-07
    • 2012-07-10
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多