使用相同的计划或打包几个插入声明并获得大量的单一使用计划?

时间:2014-11-19 15:02:51

标签: sql-server sql-execution-plan

SQL-Server 2012的最佳选择。

如果我们有一个需要插入数据库的集合。 一种方法是使用参数化查询执行每个插入,如(伪)

foreach(car in cars)
(
  sqlstring = "INSERT INTO car(name, type) VALUES(@name, @type)
  execute
)

另一种方法是将每个insert语句放在一起,只执行一个。

foreach(car in cars)
(
      sqlstring += "INSERT INTO car(name, type) VALUES(@name+index, @type+index)
)
execute

第二种方法将获得许多可能只使用一次的缓存计划。 我认为第一种方法更快。

我知道使用TableValued参数的第三个选项,但让我们跳过这个讨论。

关于表现的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

鉴于您正在使用SQL Server 2012,还有另一个选项可以更好地工作:只需将它们作为一个插入来执行:

sqlstring = "INSERT INTO car(name, type) VALUES "

foreach(car in cars)
(
      sqlstring += "(@name+index, @type+index),"
)
//Remove last comma
execute

它会将插件视为一个批次,通常应该比许多单个插件更好(当然,一如既往,最好对此进行测试以确定)。

答案 1 :(得分:0)

对于几千行,创建一个巨大的语句来保存所有内容并不实际 - 解析语句并生成计划将成为一个明显的开销,特别是如果查询大小本身变量。而是使用单个INSERT语句,但将它们包装在事务中以最小化日志记录的开销。

虽然您已经丢弃了表值参数,但这些参数也是一个可行的解决方案(当然,几乎总是比大型参数列表更好,尽管有些特殊情况下这些参数更好)。