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

Bagaimana cara membaca semua baris dari tabel besar?

Versi singkatnya adalah, panggil stmt.setFetchSize(50); dan conn.setAutoCommit(false); untuk menghindari membaca seluruh ResultSet ke dalam memori.

Inilah yang dikatakan dokumen:

Mendapatkan hasil berdasarkan kursor

Secara default, driver mengumpulkan semua hasil untuk kueri sekaligus. Ini bisa merepotkan untuk kumpulan data besar sehingga driver JDBC menyediakan sarana untuk mendasarkan ResultSet pada kursor database dan hanya mengambil sejumlah kecil baris.

Sejumlah kecil baris di-cache di sisi klien koneksi dan ketika habis, blok baris berikutnya diambil dengan memposisikan ulang kursor.

Catatan:

  • ResultSets berbasis kursor tidak dapat digunakan dalam semua situasi. Ada sejumlah batasan yang akan membuat pengemudi diam-diam kembali mengambil seluruh ResultSet sekaligus.

  • Koneksi ke server harus menggunakan protokol V3. Ini adalah default untuk (dan hanya didukung oleh) server versi7.4 dan yang lebih baru.-

  • Koneksi tidak boleh dalam mode komit otomatis. Backend menutup kursor di akhir transaksi, jadi dalam mode autocommit, backend akan menutup kursor sebelum apa pun dapat diambil darinya.-

  • Pernyataan harus dibuat dengan jenis ResultSet dari ResultSet.TYPE_FORWARD_ONLY. Ini adalah default, jadi tidak ada kode yang perlu ditulis ulang untuk memanfaatkannya, tetapi ini juga berarti bahwa Anda tidak dapat menggulir mundur atau melompat-lompat di dalam ResultSet.-

  • Kueri yang diberikan harus berupa satu pernyataan, bukan beberapa pernyataan yang dirangkai dengan titik koma.

Contoh 5.2. Menyetel ukuran pengambilan untuk mengaktifkan dan menonaktifkan kursor.

Mengubah kode ke mode kursor semudah mengatur ukuran pengambilan Pernyataan ke ukuran yang sesuai. Menyetel ukuran pengambilan kembali ke 0 akan menyebabkan semua baris di-cache (perilaku default).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kembalikan baris dari INSERT dengan ON CONFLICT tanpa perlu memperbarui

  2. Menerapkan Switchover/Switchback di PostgreSQL 9.3.

  3. Menyimpan data terenkripsi di Postgres

  4. Memetakan teks PostgreSQL[][] tipe dan tipe Java

  5. Menghitung jumlah kemunculan substring dalam string di PostgreSQL