2011-07-19 9 views
0

データベースに多数の行があり、処理する必要がありますが、メモリの制限のためにすべてのデータをメモリに取り込むことができません。データベースから順次データを取得する最も速い方法は何ですか?

現時点では、LIMITとOFFSETを使用して特定の間隔でデータを取得するためにデータを取得しています。

私はそれがより速い方法かどうか知りたいのですが、データベース内のテーブルからすべてのデータを取得する別の方法があります。フィルタは適用されず、すべての行が処理されます。

答えて

5
SELECT * FROM table ORDER BY column 

テーブル全体をRAMに吸い込む理由はありません。カーソルを開いて読み込みを開始するだけです。あなたはフェッチサイズでゲームをプレイすることができますが、あなたは行を処理している間、DBはうまくその場所を保持します。

補遺:

[OK]を、あなたは、Javaを使用している場合、私はあなたの問題が何であるかの良いアイデアを持っています。

まず、Javaを使用するだけでカーソルを使用しています。これは基本的にResultSetがJavaのものです。 ResultSetの中には他のものより柔軟性があるものもありますが、その99%は単純で前方のみのResultSetsで、各行を取得するために「次へ」と呼んでいます。

問題が発生しました。

この問題は、特にPostgres JDBCドライバの問題です。関係なく、PostgresはConnectionのautoCommitがtrueに設定されていれば、PostgresはあなたのConnectionがautoCommitをtrueに設定していれば、メソッドまたは最初の次のメソッドを実行します。あまり重要ではない場所については、あくまで列があいまいな場合は、素晴らしいOOM例外が発生します。役に立たない。

これはあなたが見ているものと簡単に一致することができ、非常に不快で紛らわしい方法に感謝します。

ほとんどの接続のデフォルトはautoCommit = trueです。代わりに、autoCommitを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(); 

例外処理の別個の欠如に注意し、読者の練習として残し。

あなたがメモリに一度にフェッチする行の数をより細かく制御したい場合は、使用することができます。それで遊んで

ps.setFetchSize(numberOfRowsToFetch); 

は、あなたのパフォーマンスを向上することがあります。

順序付けを気にする場合は、ORDER BYで使用する列に適切なインデックスがあることを確認してください。その明確なので、

+0

カーソルとは何ですか?これはどうですか? –

+0

http://www.postgresql.org/docs/current/static/sql-declare。html –

+0

カーソルをJavaに取得してデータを取得できますか? –

関連する問題