Sql server 2008 根据插入是否已经存在,执行插入的最有效方法是什么?
我正在SQL Server中执行大量从细节表到摘要表的插入。我目前正在使用左外部联接来确定在插入汇总表之前,明细表中的行是否已经存在于汇总表中,如下面的示例所示:Sql server 2008 根据插入是否已经存在,执行插入的最有效方法是什么?,sql-server-2008,tsql,Sql Server 2008,Tsql,我正在SQL Server中执行大量从细节表到摘要表的插入。我目前正在使用左外部联接来确定在插入汇总表之前,明细表中的行是否已经存在于汇总表中,如下面的示例所示: INSERT INTO TableA (columnA ,columnB ,columnC) SELECT b.columnA, b.columnB, b.columnC FROM TableB b LEFT OUTER JOIN TableA a
INSERT INTO TableA
(columnA
,columnB
,columnC)
SELECT
b.columnA,
b.columnB,
b.columnC
FROM TableB b
LEFT OUTER JOIN TableA a
on a.columnA = b.columnA
WHERE
a.columnA IS NULL
我发现,即使没有要插入的行,这种方法也需要相当长的时间,因为它必须比较所有行以确定已经存在的行。在这种情况下,我通常会考虑将一个标志添加到<代码> Table B <代码>中,以说明插入了哪些行。
但是,有几种不同的方案可以将TableB
中的一行插入TableA
中,这需要几个标志,我不想使用存储空间,因为TableB
非常大,而且越来越大
谢谢你的建议。你试过使用合并语句吗?我认为sql server在使用它时会做一些额外的优化。你能在这些表上显示PK和索引吗?哇,好建议。我修改了一个较小的脚本,该脚本目前没有可插入的记录,但以前运行该脚本仍然需要将近3分钟,应用您的方法后需要1秒。谢谢我想我没有完全理解“exists”关键字。
INSERT INTO TableA (columnA, columnB, columnC)
SELECT
b.columnA,
b.columnB,
b.columnC
FROM TableB as b
where not exists (select 1 from TableA as xx where xx.columnA = b.columnA) ;