提问人:J-Dizzle 提问时间:10/8/2014 更新时间:10/12/2014 访问量:88
哪个最快,1x 插入 512 行,4x 插入 128 行,或 512x 插入 1 行
Which would be fastest, 1x insert 512 rows, 4x insert 128 rows, or 512x insert 1 rows
问:
我有 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 中发生吗?(因此,是否有必要为每种方法获得良好的测试结果平均值?
在进行超大刀片(例如五十万次)时,我还应该考虑哪些其他因素?如果发送到数据库的数据包太大,它永远不会接收或执行查询,这是真的吗 -- 我甚至会因为进行非常大的插入而遇到麻烦吗?
答:
我的答案是假设 SQL Server;我怀疑我所说的将适用于其他 SQL 引擎。
任何 SQL Server 查询的大部分开销都是执行计划的开发。如果将其作为单个插入执行此操作,则必须制定一 (1) 次执行计划;如果分别执行 512 次插入,则必须制定 512 次执行计划。因此,单次插入的开销要小得多。
我不会惊讶地发现引擎发现了你不知道做、不想做或做不到的其他效率。但是,如果只是执行计划的节省,那么在一次插入中仍然值得这样做。
评论
答案可能会因您使用的 RDBMS 产品而异。不能以与实现无关的方式制定细粒度的优化计划。
但是你可以进行广泛的观察,例如,最好删除循环不变代码。
如果对同一个表进行多个 INSERT 循环,则可以做出有根据的猜测,即循环不变量类似于 SQL 解析和查询执行规划。某些优化器实现可能会缓存查询执行计划,而其他一些实现则不会。
因此,我们可以假设 512 行的单个 INSERT 可能更有效。同样,在给定的实施中,您的里程可能会有所不同。
至于加载数百万行,您真的应该考虑批量加载工具。大多数RDBMS品牌都有自己的特殊工具或非标准SQL语句来提供高效的批量加载,这比任何基于INSERT的解决方案都快一个数量级。
- 数据加载性能指南 (Microsoft SQL Server)
- Oracle 批量插入提示 (Oracle)
- 如何使用 LOAD DATA INFILE (MySQL) 将大文件安全地加载到 InnoDB 中
- 填充数据库 (PostgreSQL)
因此,您只是浪费了时间担心单个 INSERT 是否比多个 INSERT 更有效率。
评论
对于许多数据库来说,索引是一种开销。值得测试的是,在执行大型插入之前关闭索引,然后重新索引表是否更快。
评论