Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 根据插入是否已经存在,执行插入的最有效方法是什么?_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 根据插入是否已经存在,执行插入的最有效方法是什么?

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

我正在SQL Server中执行大量从细节表到摘要表的插入。我目前正在使用左外部联接来确定在插入汇总表之前,明细表中的行是否已经存在于汇总表中,如下面的示例所示:

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) ;