多行插入与多个单行插入


9

在我的应用程序中,我会尽可能执行多行插入操作,因为这会减少数据库与应用程序之间的往返次数。

但是,我很好奇,还有其他优势吗?例如,如果像这样一次插入多行:

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4)

与:

insert into tbl (c1, c2) values (v1, v2)
insert into tbl (c1, c2) values (v3, v4)

并且该表具有索引,在第一种情况下该索引是计算一次,在第二种情况下是两次计算?还是每次插入总是一次?假定两个查询都在同一事务中。

我正在使用PostgreSQL。


2
认为索引已更新,它是每个语句一次,而不是每一次。因此,单个语句应该比两个语句更有效。但是我不确定(因此没有答案,只是评论)
a_horse_with_no_name 2014年

1
我认为正确的问题是,它是否封装在同一笔交易中。如果两者兼而有之,就不会有什么区别。
user1363989 2014年

@ user1363989,我已经更新了我的问题,以指示两个查询将在同一笔交易中
cdmckay 2014年

Answers:


5

我认为@a_horse_with_no_name关于每个语句更新一次索引是正确的,因为如果该语句尚未完成其执行,则由于该数据正在事务中,因此该数据将不可见。语句的定义包括具有多个值

根据此处的文档与单个语句相比,批处理索引的创建/更新工作效率更高。

Peter Manis也有一篇不错的文章,介绍了我推荐的各种Insert方法的性能。

要记住的另一件事是FILLFACTOR索引的索引,因为它确实会对性能产生影响,如Fabien Coelho在此所述


如果查询是在事务中分批处理的,那么每个语句一次会发生索引更新吗?是否会由于其他原因导致性能差异?我无法访问任何一篇文章:您能否重新链接?
batbrat

1

我不认为目前在这方面索引维护方面存在任何优化差异。

除了网络开销外,多值语句的其他优点还包括解析,锁定等。(即使表锁定tbl已由第一个insert语句获取,然后在整个事务的其余部分中维护,每次插入语句仍必须验证该锁是否已持有,并且此验证不是免费的)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.