Inserto a più file vs più inserti a riga singola


9

Nella mia app faccio inserimenti su più righe quando posso solo perché riduce il numero di round trip tra il db e l'app.

Tuttavia, ero curioso, ci sono altri vantaggi? Ad esempio, se più righe vengono inserite contemporaneamente in questo modo:

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

contro:

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

e la tabella ha un indice, l'indice viene calcolato una volta nel primo caso e due volte nel secondo caso? O è sempre una volta per inserto? Supponiamo che entrambe le query si trovino nella stessa transazione.

Sto usando PostgreSQL.


2
Penso che l'indice venga aggiornato sia una volta per istruzione , non una volta per riga . Quindi la singola affermazione dovrebbe essere più efficiente delle due affermazioni. Ma non sono sicuro (quindi nessuna risposta, solo un commento)
a_horse_with_no_name

1
Penso che la domanda giusta sia: è incapsulato nella stessa transazione. Fuori dallo stomaco, se ci sono entrambi in una transazione, non ci sarà differenza.
user1363989,

@ user1363989, ho aggiornato la mia domanda per indicare che entrambe le query sarebbero state nella stessa transazione
cdmckay,

Risposte:


5

Penso che @a_horse_with_no_name abbia ragione sul fatto che l'indice viene aggiornato una volta per ogni istruzione, perché se l'istruzione non ha completato la sua esecuzione i dati non saranno visibili poiché sono in transazione. E la definizione di un'istruzione include avere più valori

E acconsentire ai documenti qui la creazione / aggiornamento dell'indice funziona in modo più efficiente con i batch rispetto alle singole istruzioni.

C'è anche un bell'articolo di Peter Manis sulle prestazioni di vari metodi di inserimento che posso consigliare.

Un'altra cosa da tenere a mente è l' FILLFACTORindice in quanto ha un impatto sulle prestazioni, come descritto qui da Fabien Coelho .


Se le query vengono raggruppate in una transazione, l'aggiornamento dell'indice avverrà una volta per ogni dichiarazione? Ci sarà una differenza di prestazioni dovuta a qualcos'altro? Non riesco ad accedere a nessuno dei due articoli: potresti ricollegarti, per favore?
Batbrat,

1

Non credo che al momento vi siano differenze di ottimizzazione nell'area della manutenzione degli indici.

Oltre all'overhead di rete, gli altri vantaggi dell'istruzione multi-valore sono l'analisi, il blocco, ecc. (Anche se il blocco della tabella tblè preso dalla prima istruzione insert e quindi mantenuto per il resto della transazione, ogni inserimento dichiarazione deve ancora verificare che il blocco sia attivo e questa verifica non è gratuita)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.