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

Apa cara tercepat untuk mengambil data sekuensial dari database?

SELECT * FROM table ORDER BY column

Tidak ada alasan untuk menyedot seluruh tabel ke dalam RAM. Cukup buka kursor dan mulai membaca. Anda dapat memainkan game dengan ukuran pengambilan dan yang tidak, tetapi DB akan dengan senang hati mempertahankan tempatnya saat Anda memproses baris.

Tambahan:

Oke, jika Anda menggunakan Java, saya tahu apa masalah Anda.

Pertama, hanya dengan menggunakan Java, Anda menggunakan kursor. Pada dasarnya itulah ResultSet di Jawa. Beberapa ResultSet lebih fleksibel daripada yang lain, tetapi 99% di antaranya sederhana, hanya meneruskan ResultSet yang Anda panggil 'berikutnya' untuk mendapatkan setiap baris.

Sekarang untuk masalah Anda.

Masalahnya khusus dengan driver Postgres JDBC. Saya tidak tahu mengapa mereka melakukan ini, mungkin spesifikasinya, mungkin itu sesuatu yang lain, tetapi terlepas dari itu, Postgres memiliki karakteristik yang aneh bahwa jika Koneksi Anda memiliki autoCommit yang disetel ke true, maka Postgres memutuskan untuk menyedot seluruh hasil yang ditetapkan pada salah satu mengeksekusi metode atau metode pertama berikutnya. Tidak terlalu penting di mana, hanya saja jika Anda memiliki trilyun baris, Anda mendapatkan pengecualian OOM yang bagus. Tidak membantu.

Ini dapat dengan mudah menjadi apa yang Anda lihat, dan saya menghargai bagaimana hal itu bisa sangat membuat frustrasi dan membingungkan.

Sebagian besar Koneksi default ke autoCommit =true. Sebagai gantinya, cukup setel autoCommit ke false.

Connection con = ...get Connection...
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
    String col1 = rs.getString(1);
    ...and away you go here...
}
rs.close();
ps.close();
con.close();

Perhatikan kurangnya penanganan pengecualian, dibiarkan sebagai latihan untuk pembaca.

Jika Anda ingin lebih mengontrol berapa banyak baris yang diambil sekaligus ke dalam memori, Anda dapat menggunakan:

ps.setFetchSize(numberOfRowsToFetch);

Bermain-main dengan itu dapat meningkatkan kinerja Anda.

Pastikan Anda memiliki indeks yang sesuai pada kolom yang Anda gunakan di ORDER BY jika Anda peduli dengan pengurutan sama sekali.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan aplikasi Rails Heroku

  2. Menambahkan kolom ke tabel dengan nilai dari baris berikutnya

  3. PostgreSQL - rekursi tak terbatas terdeteksi dalam kebijakan untuk relasi

  4. Pemicu PostgreSQL tidak mengembalikan apa pun

  5. Postgres :dapatkan jumlah baris min dan maks di banyak ke banyak tabel relasi