我正在测试使用单个INSERT语句插入多行的速度。
例如: INSERT INTO [MyTable] VALUES(5,'dog'),(6,'cat'),(3,'fish)
这是非常快的,直到我在一个语句上传递50行,然后速度显着下降。
在50个批次中插入10000行需要0.9秒。 插入10000行,批次为51,需要5.7秒。
我的问题分为两部分:
我的测试是在c ++和ADO中完成的。
编辑: 看起来下降点不是50行,而是1000列。我得到了50行20列或100行10列的类似结果。
答案 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)
随机想法:
答案 5 :(得分:0)
对于高容量和高频率插入,请考虑使用Bulk Inserts加载数据。这不是世界上最简单的实现方式,它带来了一系列新的挑战,但它比INSERT快得多。