Многорядная вставка против нескольких однорядных вставок

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.

cdmckay
источник
2
Я думаю, что индекс обновляется один раз за утверждение , а не один раз за строку . Таким образом, одно утверждение должно быть более эффективным, чем два утверждения. Но я не уверен (следовательно, нет ответа, просто комментарий)
a_horse_with_no_name
1
Я думаю, что правильный вопрос заключается в том, заключен ли он в одну транзакцию. Из желудка, если есть и то, и другое в сделке, не будет разницы.
user1363989
@ user1363989, я обновил свой вопрос, чтобы указать, что оба запроса будут в одной транзакции
cdmckay

Ответы:

5

Я думаю, что @a_horse_with_no_name правильно о том, что индекс обновляется один раз для каждого оператора, потому что, если оператор не завершил свое выполнение, данные не будут видны, так как он находится в транзакции. И определение утверждения включает в себя наличие нескольких значений

И accoriding к документации здесь создание индекса / обновление работает более эффективно , с партиями , чем отдельные заявления.

Есть также хорошая статья Питера Маниса о производительности различных методов вставки, которую я могу порекомендовать.

Следует также помнить FILLFACTORо индексе, так как он влияет на производительность, как описывает Фабьен Коэльо .

Вениамин
источник
Если запросы выполняются в транзакции, произойдет ли обновление индекса один раз на оператор? Будет ли разница в производительности из-за чего-то еще? Я не могу получить доступ ни к одной статье: не могли бы вы дать ссылку?
Батбрат
1

Я не верю, что в настоящее время существуют какие-либо различия в оптимизации в области поддержания индекса в этом отношении.

В дополнение к нагрузке на сеть, другие преимущества оператора с несколькими значениями заключаются в разборе, блокировке и т. Д. (Несмотря на то, что блокировка таблицы tblберется первым оператором вставки и затем поддерживается в течение всей транзакции, каждая вставка оператор еще должен проверить, что блокировка удерживается, и эта проверка не бесплатна)

jjanes
источник