Sisipan multi-baris vs beberapa sisipan baris tunggal

9

Dalam aplikasi saya, saya melakukan insert multi-baris ketika saya bisa hanya karena itu mengurangi jumlah perjalanan bolak-balik antara db dan aplikasi.

Namun, saya penasaran, apakah ada kelebihan lain? Misalnya, jika beberapa baris dimasukkan sekaligus seperti ini:

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

melawan:

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

dan tabel memiliki indeks, apakah indeks dihitung sekali dalam kasus pertama, dan dua kali dalam kasus kedua? Atau apakah itu selalu satu kali per insert? Asumsikan kedua kueri dalam transaksi yang sama.

Saya menggunakan PostgreSQL.

cdmckay
sumber
2
Saya pikir indeks diperbarui sekali per pernyataan , bukan sekali per baris . Jadi pernyataan tunggal harus lebih efisien daripada dua pernyataan. Tapi saya tidak yakin (karenanya tidak ada jawaban, hanya komentar)
a_horse_with_no_name
1
Saya pikir pertanyaan yang tepat adalah, apakah itu dirangkum dalam transaksi yang sama. Keluar dari perut, jika ada keduanya dalam transaksi, tidak akan ada perbedaan.
user1363989
@ user1363989, saya telah memperbarui pertanyaan saya untuk menunjukkan bahwa kedua pertanyaan akan berada dalam transaksi yang sama
cdmckay

Jawaban:

5

Saya pikir @a_horse_with_no_name benar tentang indeks diperbarui sekali per pernyataan, karena jika pernyataan belum menyelesaikan eksekusi, data tidak akan terlihat karena sedang dalam transaksi. Dan definisi pernyataan termasuk memiliki banyak nilai

Dan menurut dokumen di sini pembuatan / pembaruan indeks bekerja lebih efisien dengan batch daripada pernyataan tunggal.

Ada juga artikel bagus dari Peter Manis tentang kinerja berbagai metode Sisipan yang dapat saya rekomendasikan.

Hal lain yang perlu diingat adalah FILLFACTORindeks karena hal itu berdampak pada kinerja seperti yang dijelaskan Fabien Coelho di sini .

Benjamin
sumber
Jika kueri dikumpulkan dalam suatu transaksi, apakah pembaruan indeks akan terjadi satu kali per pernyataan? Apakah akan ada perbedaan kinerja karena hal lain? Saya tidak dapat mengakses artikel mana pun: bisakah Anda menghubungkan kembali?
batbrat
1

Saya tidak percaya saat ini ada perbedaan optimasi dalam hal pemeliharaan indeks dalam hal ini.

Selain overhead jaringan, keuntungan lain dari pernyataan multi-nilai adalah penguraian, penguncian, dll. (Meskipun penguncian tabel tbldiambil oleh pernyataan penyisipan pertama dan kemudian dipertahankan sepanjang sisa transaksi, setiap penyisipan pernyataan masih harus memverifikasi bahwa kunci dipegang, dan verifikasi ini tidak gratis)

jjanes
sumber