PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pemahaman operasi batch JDBC

Mungkin ada berbagai jenis pengelompokan yang terlibat, dan saya akan membahas sebagian dari driver PostgreSQL JDBC (pgjdbc).

TL; DR:pgjdbc memang menggunakan lebih sedikit roundrip jaringan jika API batch digunakan. BatchedQuery hanya digunakan jika reWriteBatchedInserts=true diteruskan ke pengaturan koneksi pgjdbc.

Anda mungkin menemukan https://www.slideshare.net/VladimirSitnikv/postgresql-and-jdbc-striving-for-high-performance relevan (slide 44,...)

Dalam hal eksekusi kueri, latensi jaringan sering kali menjadi bagian penting dari waktu yang telah berlalu.

Misalkan kasusnya adalah menyisipkan 10 baris.

  1. Tanpa pengelompokan (mis. hanya PreparedStatement#execute dalam satu lingkaran). Pengemudi akan melakukan yang berikut

    execute query
    sync <-- wait for the response from the DB
    execute query
    sync <-- wait for the response from the DB
    execute query
    sync <-- wait for the response from the DB
    ...
    

    Waktu penting akan dihabiskan dalam "menunggu DB"

  2. API batch JDBC. Itu adalah PreparedStatement#addBatch() memungkinkan pengemudi mengirim beberapa "eksekusi kueri" dalam satu perjalanan pulang pergi jaringan. Implementasi saat ini, bagaimanapun, masih akan membagi batch besar menjadi batch yang lebih kecil untuk menghindari kebuntuan TCP.

    Tindakannya akan jauh lebih baik:

    execute query
    ...
    execute query
    execute query
    execute query
    sync <-- wait for the response from the DB
    
  3. Perhatikan, bahkan dengan #addBatch , ada perintah "eksekusi kueri" yang berlebihan. Server membutuhkan waktu yang cukup lama untuk memproses setiap pesan satu per satu.

    Salah satu cara untuk mengurangi jumlah kueri adalah dengan menggunakan sisipan multi-nilai. Misalnya:

    insert into tab(a,b,c) values (?,?,?), (?,?,?), ..., (?,?,?)
    

    PostgreSQL ini memungkinkan untuk menyisipkan beberapa baris sekaligus. Kekurangannya adalah Anda tidak memiliki pesan kesalahan rinci (per-baris). Saat ini Hibernate tidak mengimplementasikan penyisipan multi-nilai.

    Namun pgjdbc dapat menulis ulang sisipan batch reguler menjadi multi-nilai dengan cepat sejak 9.4.1209 (2016-07-15).

    Untuk mengaktifkan penulisan ulang multi-nilai, Anda perlu menambahkan reWriteBatchedInserts=true properti koneksi. Fitur ini awalnya dikembangkan di https://github.com/pgjdbc/pgjdbc/pull/491

    Cukup pintar untuk menggunakan 2 pernyataan untuk menyisipkan 10 baris. Yang pertama adalah pernyataan bernilai 8, dan yang kedua adalah pernyataan bernilai 2. Penggunaan kekuatan dua memungkinkan pgjdbc untuk menjaga jumlah pernyataan yang berbeda tetap waras, dan itu meningkatkan kinerja karena pernyataan yang sering digunakan disiapkan oleh server (lihat Berapa lama masa pakai pernyataan yang disiapkan sisi server PostgreSQL )

    BatchedQuery mewakili pernyataan multi-nilai semacam itu, jadi Anda akan melihat kelas itu digunakan di reWriteBatchedInserts=true kasus saja.

    Kelemahan fitur ini mungkin termasuk:detail yang lebih rendah sebagai "hasil batch". Misalnya, batch reguler memberi Anda "per jumlah baris pernyataan", namun dalam kasus multi-nilai Anda baru saja mendapatkan status "pernyataan selesai". Selain itu, penulis ulang on-the-fly mungkin gagal mengurai pernyataan SQL tertentu (mis. https://github.com/pgjdbc/pgjdbc/issues/1045 ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instruksi ilegal:4 saat menjalankan Django

  2. Mengumumkan repmgr 2.0RC2

  3. Karakter maksimum dalam label (nama tabel, kolom, dll)

  4. Salin beberapa kolom file csv ke dalam tabel

  5. Bagaimana Anda menggabungkan dua tabel pada bidang kunci asing menggunakan Django ORM?