哪个最快,1x插入512行,4x插入128行,或512x插入1行

时间:2014-10-07 19:50:36

标签: sql database performance language-agnostic query-performance

我有512行要插入数据库。我想知道在一个大插件上提交多个插件是否有任何优势。例如

1x 512行插入 -

INSERT INTO mydb.mytable (id, phonenumber)
VALUES (1, 555-555-5555) , (2, 555-555-5555) , (3, 555-555-5555), //repeat to id = 512

VS 4x 128行插入

INSERT INTO mydb.mytable (id, phonenumber)
VALUES (1, 555-555-5555) , (2, 555-555-5555) , (3, 555-555-5555), //repeat to id = 128
INSERT INTO mydb.mytable (id, phonenumber)
VALUES (129, 555-555-5555) , (130, 555-555-5555) , (131, 555-555-5555), //repeat to id = 256, then next 128, then next 128.

VS 512x 1行插入

INSERT INTO mydb.mytable (id, phonenumber)
VALUES (1, 555-555-5555)
INSERT INTO mydb.mytable (id, phonenumber)
VALUES (2, 555-555-5555) // repeat until id = 512

关于测试这个的问题,如果我将其设置为测试 - 假设我做第一种方法,一个大的512行插入。这需要0.5秒。然后下一次需要0.3秒 - 这个缓存我认为会发生,就像编程语言执行相同的操作两次一样,发生在sql中吗? (因此,为每种方法获得一个很好的平均测试结果是否必要?)

在进行极大插入(例如,50万次)时,我应该考虑哪些其他注意事项?如果发送到数据库的数据包太大,它将永远不会收到或执行查询 - 我是否会因为制作非常大的插入而遇到麻烦?

3 个答案:

答案 0 :(得分:5)

我的答案是假设SQL Server;我怀疑我所说的适用于其他SQL引擎。

任何SQL Server查询的大部分开销都是执行计划的开发。如果您将此作为单个插入执行,则必须一(1)次开发执行计划;如果你做512个单独的插入,它将必须开发执行计划512次。因此,单个插入的开销要小得多。

我发现发动机发现了你不知道要做的,不会想到的,或者不能做的其他效率,我不会感到惊讶。但如果仅仅是执行计划的节省,它仍然值得在一次插入中进行。

答案 1 :(得分:4)

答案可能会根据您使用的RDBMS产品而有所不同。我们无法以与实现无关的方式制定细粒度的优化计划。

但你可以进行广泛的观察,例如remove loop-invariant code更好。

对于同一个表的许多INSERT的循环,您可以做出有根据的猜测,即循环不变量就像SQL解析和查询执行计划。一些优化器实现可以缓存查询执行计划,其他一些实现不会。

因此我们可以假设512行的单个INSERT可能更有效。同样,在给定的实施中,您的里程可能会有所不同。

至于加载数百万行,你应该考虑批量加载工具。大多数RDBMS品牌都有自己的特殊工具或非标准SQL语句来提供有效的批量加载,这比任何基于INSERT的解决方案快一个数量级。

因此,您只是浪费时间来担心单个INSERT是否比多个INSERT更有效。

答案 2 :(得分:0)

对于许多数据库而言,索引是一种开销。值得测试的是,在执行大型插入之前关闭索引是否更快,然后再对表进行索引。