Mehrzeilige Einfügung gegen mehrere einzeilige Einfügungen

9

In meiner App füge ich mehrzeilige Einfügungen ein, wenn ich kann, nur weil dadurch die Anzahl der Roundtrips zwischen der Datenbank und der App verringert wird.

Ich war jedoch neugierig, gibt es noch andere Vorteile? Wenn beispielsweise mehrere Zeilen gleichzeitig eingefügt werden:

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

gegen:

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

und die Tabelle hat einen Index. Wird der Index im ersten Fall einmal und im zweiten Fall zweimal berechnet? Oder ist es immer einmal pro Beilage? Angenommen, beide Abfragen befinden sich in derselben Transaktion.

Ich benutze PostgreSQL.

cdmckay
quelle
2
Ich denke, der Index wird einmal pro Anweisung aktualisiert , nicht einmal pro Zeile . Die einzelne Anweisung sollte also effizienter sein als die beiden Anweisungen. Aber ich bin nicht sicher (daher keine Antwort, nur ein Kommentar)
a_horse_with_no_name
1
Ich denke, die richtige Frage ist, ob sie in derselben Transaktion enthalten ist. Aus dem Magen heraus, wenn es beide in einer Transaktion gibt, wird es keinen Unterschied geben.
user1363989
@ user1363989, ich habe meine Frage aktualisiert, um anzuzeigen, dass beide Abfragen in der gleichen Transaktion sein würden
cdmckay

Antworten:

5

Ich denke, @a_horse_with_no_name hat Recht damit, dass der Index einmal pro Anweisung aktualisiert wird, denn wenn die Anweisung ihre Ausführung nicht abgeschlossen hat, sind die Daten nicht sichtbar, da sie sich in der Transaktion befinden. Und die Definition einer Anweisung beinhaltet mehrere Werte

Und gemäß den hier beschriebenen Dokumenten funktioniert die Indexerstellung / -aktualisierung mit Stapeln effizienter als mit einzelnen Anweisungen.

Es gibt auch einen schönen Artikel von Peter Manis über die Leistung verschiedener Insert-Methoden, den ich empfehlen kann.

Eine andere Sache, die Sie beachten sollten, ist der FILLFACTORIndex, da er sich auf die Performance auswirkt, wie Fabien Coelho hier beschreibt .

Benjamin
quelle
Wenn die Abfragen in einer Transaktion gestapelt werden, erfolgt die Indexaktualisierung einmal pro Anweisung? Wird es aufgrund von etwas anderem einen Leistungsunterschied geben? Ich kann auf keinen der Artikel zugreifen: Könnten Sie bitte erneut verlinken?
Batbrat
1

Ich glaube nicht, dass es derzeit Optimierungsunterschiede im Bereich der Indexpflege in dieser Hinsicht gibt.

Neben dem Netzwerk-Overhead liegen die weiteren Vorteile der mehrwertigen Anweisung im Parsen, Sperren usw. (Auch wenn die Tabellensperre tblvon der ersten Einfügeanweisung übernommen und dann während des restlichen Transaktionsvorgangs bei jeder Einfügung beibehalten wird Anweisung muss noch überprüfen, ob die Sperre gehalten wird, und diese Überprüfung ist nicht kostenlos)

jjanes
quelle