SQLServer 2008中具有单个INSERT的多行

时间:2010-04-12 16:35:12

标签: c++ sql ado

我正在测试使用单个INSERT语句插入多行的速度。

例如: INSERT INTO [MyTable] VALUES(5,'dog'),(6,'cat'),(3,'fish)

这是非常快的,直到我在一个语句上传递50行,然后速度显着下降。

在50个批次中插入10000行需要0.9秒。 插入10000行,批次为51,需要5.7秒。

我的问题分为两部分:

  1. 为什么50岁时会出现如此严重的性能下降?
  2. 我是否可以依赖此行为并将我的应用程序编码为永远不会发送大于50的批次?
  3. 我的测试是在c ++和ADO中完成的。

    编辑: 看起来下降点不是50行,而是1000列。我得到了50行20列或100行10列的类似结果。

6 个答案:

答案 0 :(得分:2)

它也可能与行的大小有关。您用作示例的表似乎只有2列。如果它有25列怎么办?性能是否也在50行下降?

答案 1 :(得分:0)

您是否也与此处显示的“all all”方法进行了比较? http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/

我怀疑有一个内部缓存/索引,最多使用50行(这是一个很好的圆十进制数字)。在50行之后,它回落到效率较低的一般情况插入算法,该算法可以处理任意数量的输入而不会占用过多的内存。

答案 2 :(得分:0)

减速可能是解析字符串值:VALUES (5, 'dog'), (6, 'cat'), (3, 'fish)而不是INSERT问题。

尝试这样的事情,它将为查询返回的每一行插入一行:

INSERT INTO YourTable1
    (col1, col2)
    SELECT
        Value1, Value2
        FROM YourTable2
        WHERE ...--rows will be more than 50

看看会发生什么

答案 3 :(得分:0)

如果您使用的是SQL 2008,那么您可以使用表值参数,只需执行一个insert语句。

个人而言,即使是常规批次,我也从未见过50次插入记录的减速。无论我们移动到表值参数,这些参数对我们来说都有显着的增长速度。

答案 4 :(得分:0)

随机想法:

  • 重复运行时是否完全一致?
  • 你是否在第1个10k行中检查第2个10k插入的重复项?
  • 你先尝试51的批量大小吗?
  • 你是否在测试之间清空了表?

答案 5 :(得分:0)

对于高容量和高频率插入,请考虑使用Bulk Inserts加载数据。这不是世界上最简单的实现方式,它带来了一系列新的挑战,但它比INSERT快得多。