用于在SQL Server中合并两个表的最快选项

时间:2018-04-19 08:42:48

标签: sql sql-server database tsql

考虑两个非常大的表,表A中有2000万行,表B与TableA有大量重叠,有1000万行。两者都有一个标识符列和一堆其他数据。我需要将表B中的所有项目移动到表A中,以更新它们已存在的位置。

Both table structures
 - Identifier int
 - Date DateTime,
 - Identifier A
 - Identifier B
 - General decimal data.. (maybe 10 columns)

我可以获得表B中的新项目,并获得表B中需要在表A中快速更新的项目,但我无法获得更新或删除插入以快速工作。有哪些选项可以在最短的时间内将TableB的内容合并到TableA中(即更新现有记录而不是插入)?

我试图提取TableB中的现有记录并在表A上运行大量更新来更新那些行(即每行更新语句),性能非常糟糕,即使它具有良好的索引

我还试图一次性删除TableB中存在的TableA中的不同值,删除的性能也很差,即使索引被删除。

我很欣赏这可能难以快速执行,但我正在寻找可用于实现此目的的其他选项。

2 个答案:

答案 0 :(得分:3)

由于您处理两个大型表,就地更新/插入/合并可能是耗时的操作。我建议使用一些批量日志记录技术来将所需内容加载到新表并执行表交换:

使用 SELECT INTO:

的示例
SELECT * 
INTO NewTableA
FROM (
SELECT * FROM dbo.TableB b WHERE NOT EXISTS (SELECT * FROM dbo.TableA a WHERE a.id = b.id)
UNION ALL
SELECT * FROM dbo.TableA a
) d

exec sp_rename 'TableA', 'BackupTableA'
exec sp_rename 'NewTableA', 'TableA'
对于此类方法,强烈建议

简单或至少批量记录恢复。此外,我认为必须在业务时间之外完成,因为要在新表上重新创建大量缺少的对象:索引,默认约束,主键等。

答案 1 :(得分:1)

如果你想同时插入和更新,合并可能是你最好的选择。

type="Submit"

请注意,merge语句必须以;

结尾