PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jaki jest najszybszy sposób na pobranie sekwencyjnych danych z bazy danych?

SELECT * FROM table ORDER BY column

Nie ma powodu, aby wciągać całą tabelę do pamięci RAM. Po prostu otwórz kursor i zacznij czytać. Możesz grać w gry z rozmiarami pobierania i innymi, ale DB z radością zachowa swoje miejsce podczas przetwarzania wierszy.

Dodatek:

OK, jeśli używasz Javy, mam dobry pomysł, na czym polega Twój problem.

Po pierwsze, używając tylko Javy, używasz kursora. To jest w zasadzie zestaw wyników w Javie. Niektóre zestawy wyników są bardziej elastyczne niż inne, ale 99% z nich to proste, tylko do przodu zestawy wyników, które wywołujesz „następny”, aby uzyskać każdy wiersz.

Teraz, jeśli chodzi o Twój problem.

Problem dotyczy w szczególności sterownika Postgres JDBC. Nie wiem, dlaczego to robią, może to specyfika, może to coś innego, ale niezależnie od tego, Postgres ma ciekawą cechę, że jeśli twoje połączenie ma ustawione na wartość true, to Postgres postanawia zassać cały zestaw wyników na wykonaj metodę lub pierwszą następną metodę. Nie ma większego znaczenia, gdzie, tylko, że jeśli masz biliony wierszy, otrzymujesz niezły wyjątek OOM. Nieprzydatne.

To może być dokładnie to, co widzisz, i doceniam to, że może to być dość frustrujące i mylące.

Większość połączeń domyślnie to autoCommit =true. Zamiast tego po prostu ustaw autoCommit na 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();

Zwróć uwagę na wyraźny brak obsługi wyjątków, pozostawiony jako ćwiczenie dla czytelnika.

Jeśli chcesz mieć większą kontrolę nad tym, ile wierszy jest jednocześnie pobieranych do pamięci, możesz użyć:

ps.setFetchSize(numberOfRowsToFetch);

Zabawa z tym może poprawić Twoją wydajność.

Upewnij się, że masz odpowiedni indeks w kolumnie, której używasz w ORDER BY, jeśli w ogóle zależy Ci na sekwencjonowaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kontynuacja transakcji po błędzie naruszenia klucza podstawowego

  2. Sqlalchemy powielił klauzulę WHERE do FROM

  3. PgAdmin4 włącz debugowanie

  4. Zapytanie PostgreSQL bardzo wolne z limitem 1

  5. Postgres:Kolumna Uporządkuj według ciągu znaków ze znanymi wartościami