Багаторядкова вставка проти декількох вставок з одним рядком


9

У своєму додатку я роблю багаторядкові вставки, коли можу лише тому, що це зменшує кількість обходів між db та додатком.

Однак мені було цікаво, чи є інші переваги? Наприклад, якщо одночасно вставлено кілька рядків:

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

1
Я думаю, що правильне питання полягає в тому, чи закріплено в одній транзакції. Якщо у шлунку немає обох, різниці не буде.
користувач1363989

@ user1363989, я оновив своє запитання, щоб вказати, що обидва запити будуть в одній транзакції
cdmckay

Відповіді:


5

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

І присвоєння документам тут створення / оновлення індексу працює ефективніше з партіями, ніж окремі заяви.

Також є приємна стаття Пітера Маніса про виконання різних методів Insert, які я можу порекомендувати.

Інша річ, яку слід пам’ятати, - це FILLFACTORіндекс, оскільки він впливає на продуктивність, як описує тут Фабієн Коельо .


Якщо запити зібрані в транзакції, чи відбуватиметься оновлення індексу один раз за заявою? Чи буде різниця в продуктивності через щось інше? Я не можу отримати доступ до жодної статті.
батбрат

1

Я не вірю, що в даний час існують оптимізаційні відмінності в області обслуговування індексу.

Окрім мережевих накладних витрат, інші переваги оператора з багатозначними значеннями полягають у синтаксичному розборі, блокуванні тощо (навіть незважаючи на те, що блокування таблиці tblвиконується першим оператором вставки та зберігається протягом усієї транзакції, кожна вставка оператор все ще повинен підтвердити, що блокування проведено, і ця перевірка не є безкоштовною)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.