Retrieve large ResultSetTag(s): JDBC
JDBC provides a way to give a hint about the size of the expected ResultSet.
Statement.setFetchSize() gives a hint about the number of rows that should be fetched from the database each time new rows are needed. The goal is to reduce unnecessary network round trip.
With Oracle, the default value is 10 (i.e. the Oracle driver will retrieve ResultSets in 10-row chunks)
A JDBC Compliant driver may choose to ignore the setFetchSize(). You should do some testing first to check if the result is optimal.
See (Sun) 5.1.9 Providing Performance Hints
import java.io.FileWriter; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class PerfSelect { public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException { Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:@//oracle.server:1529/prod"; Connection conn = DriverManager.getConnection(url, "scott", "tiger"); conn.setAutoCommit(false); ExecutionTimer t = new ExecutionTimer(); // see this HowTo String sql = "SELECT * FROM PROD.DOCUMENTS"; t.start(); Statement stmt = conn.createStatement(); stmt.setFetchSize(200); ResultSet rs = stmt.executeQuery(sql); FileWriter fw = new FileWriter("d:/temp/o.out"); while (rs.next()) { fw.write(rs.getString(1) + " " + rs.getString(2) + "\n"); } t.end(); System.out.println("Timer : " + t.duration()); stmt.close(); rs.close(); fw.flush(); fw.close(); System.out.println("Ok."); } } /* 348831 rows without prefetch (def == 10) 48296 ms 48045 ms prefetch == 100 14859 14749 prefetch == 200 13343 13296 prefetch == 500 13891 13812 prefetch == 1000 13078 13078 */
mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com