SELECT * FROM table ORDER BY column
Není důvod nasávat celou tabulku do RAM. Jednoduše otevřete kurzor a začněte číst. Můžete hrát hry s velikostí načítání a co ne, ale DB si s radostí udrží své místo, zatímco budete zpracovávat své řádky.
Dodatek:
Dobře, pokud používáte Javu, pak mám dobrou představu, jaký je váš problém.
Za prvé, pouze pomocí Javy používáte kurzor. To je v podstatě to, co je ResultSet v Javě. Některé sady výsledků jsou flexibilnější než jiné, ale 99 % z nich jsou jednoduché sady výsledků, které lze přeposílat pouze jako „další“, abyste získali každý řádek.
Nyní k vašemu problému.
Problém je konkrétně s ovladačem Postgres JDBC. Nevím, proč to dělají, možná je to specifikace, možná je to něco jiného, ale bez ohledu na to má Postgres tu zvláštní vlastnost, že pokud má vaše připojení autoCommit nastaveno na true, pak se Postgres rozhodne nasát celou sadu výsledků buď na provést metodu nebo první další metodu. Není opravdu důležité, kde, pouze pokud máte gazilión řádků, získáte pěknou OOM výjimku. Není užitečné.
Snadno to může být přesně to, co vidíte, a oceňuji, jak to může být docela frustrující a matoucí.
Většina připojení má výchozí hodnotu autoCommit =true. Místo toho jednoduše nastavte 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();
Všimněte si zřetelného nedostatku zpracování výjimek, který je ponechán jako cvičení pro čtenáře.
Pokud chcete mít větší kontrolu nad tím, kolik řádků je najednou načteno do paměti, můžete použít:
ps.setFetchSize(numberOfRowsToFetch);
Když si s tím budete hrát, může to zlepšit váš výkon.
Ujistěte se, že máte odpovídající index ve sloupci, který používáte v ORDER BY, pokud vám vůbec záleží na sekvenování.