tsql-批插入性能

tsql-批插入性能,tsql,sql-server-2005,Tsql,Sql Server 2005,我想提高我正在处理的应用程序中一些插入的速度。 我最初创建的批处理如下所示: insert tableA (field1, field2) values (1,'test1'), (2, 'test2') insert tableA (field1, field2) select 1, 'test1' union all select 2, 'test2' 这在SQLServer2008和更高版本上非常有效,但我需要插入内容才能在SQLServer2005上工作。我的问题是,使用这样的批处理

我想提高我正在处理的应用程序中一些插入的速度。 我最初创建的批处理如下所示:

insert tableA (field1, field2) values (1,'test1'), (2, 'test2')
insert tableA (field1, field2)
select 1, 'test1'
union all
select 2, 'test2'
这在SQLServer2008和更高版本上非常有效,但我需要插入内容才能在SQLServer2005上工作。我的问题是,使用这样的批处理是否会获得性能优势:

insert tableA (field1, field2) values (1,'test1'), (2, 'test2')
insert tableA (field1, field2)
select 1, 'test1'
union all
select 2, 'test2'
在这一批中:

insert tableA (field1, field2) values (1, 'test1')
insert tableA (field1, field2) values (2, 'test2')

尽管看起来要处理的代码越少,性能就越好,但使用第一个选项UNIONALL是个坏主意。 在将数据插入表之前,必须解析并执行所有select语句。它将消耗大量内存,即使是非常少量的数据,也可能需要很长时间才能完成。另一方面,单独的insert语句会动态执行

在SSMS中运行一个简单的测试来证明这一点:创建一个包含4个字段的简单表,然后尝试插入20k行。第二个解决方案将在几秒钟内执行,而第一个。。。您将看到:

另一个问题是,当som行类型不匹配中的数据不正确时,例如,将varchar值“x”转换为数据类型int时,您将收到一个错误,如转换失败,但您将无法指示哪一行失败-您必须自己查找它。但是使用单独的插入,您将确切地知道哪个插入失败