fuyou001 发表于 2013-1-29 22:46:07

fetchSIze 对性能的影响

class DemoPrefetch{public static void main(String[] args){       int connLevelDefaultPrefetch = 5;    int stmtLevelFetchSize = 20;    int rsetLevelFetchSize = 50;    Connection conn = null;    try    {      conn = JDBCUtil.getConnection("fuyou", "fuyou", "orcl");      System.out.println( "\nDefault connection fetch size: " + ((OracleConnection) conn).getDefaultRowPrefetch() );      System.out.println( "setting the default fetch size at connection level to " + connLevelDefaultPrefetch );      ((OracleConnection) conn).setDefaultRowPrefetch( connLevelDefaultPrefetch);      System.out.println( "Now the connection fetch size: " + ((OracleConnection) conn).getDefaultRowPrefetch() );         JDBCUtil.getTraceName(conn);//取得跟踪文件      JDBCUtil.startTrace( conn );//设置跟踪            _demoPstmtFetchSize( conn, connLevelDefaultPrefetch, stmtLevelFetchSize);      _demoPstmtFetchSizeWithRsetOverride( conn, connLevelDefaultPrefetch, stmtLevelFetchSize, rsetLevelFetchSize );      _demoCstmtFetchSize( conn, connLevelDefaultPrefetch, stmtLevelFetchSize );      _demoCstmtFetchSizeWithRsetOverride( conn, connLevelDefaultPrefetch, stmtLevelFetchSize, rsetLevelFetchSize );      JDBCUtil.cancleTrace(conn);    }    catch (SQLException e)    {      // handle the exception properly - in this case, we just       // print the stack trace.      JDBCUtil.printException ( e );    }    finally    {      // release the JDBC resources in the finally clause.      JDBCUtil.close( conn );    }} // end of main()private static void _demoPstmtFetchSize( Connection conn,    int connLevelDefaultPrefetch, int stmtLevelFetchSize ) throws SQLException{    System.out.println( "Inside _demoPstmtFetchSize" );    String sqlTag = "/*+" +                     "(CONN="+ connLevelDefaultPrefetch + ")" +                  "(PSTMT=" + stmtLevelFetchSize       + ")" +                  "*/";    String stmtString = "select x "+ sqlTag + " from t1 where rownum <= ?";    PreparedStatement pstmt = null;    ResultSet rset = null;   try    {      pstmt = conn.prepareStatement( stmtString );      System.out.println( "\tDefault statement fetch size: " + pstmt.getFetchSize());      pstmt.setFetchSize( stmtLevelFetchSize );      System.out.println( "\tnew statement fetch size: " + pstmt.getFetchSize());      pstmt.setInt( 1, 100 );      rset = pstmt.executeQuery();      System.out.println( "\tResult set fetch size: " + rset.getFetchSize());      int i=0;      while (rset.next())      {      i++;      }      System.out.println( "\tnumber of times in the loop: " + i );    }    finally    {      // release JDBC related resources in the finally clause.      JDBCUtil.close( rset );      JDBCUtil.close( pstmt );    }}private static void _demoPstmtFetchSizeWithRsetOverride( Connection conn,    int connLevelDefaultPrefetch, int stmtLevelFetchSize,   int rsetLevelFetchSize ) throws SQLException{    System.out.println( "Inside _demoPstmtFetchSizeWithRsetOverride" );    String sqlTag = "/*+" +                     "(CONN="+ connLevelDefaultPrefetch + ")" +                  "(PSTMT=" + stmtLevelFetchSize       + ")" +                     "(RSET="+ rsetLevelFetchSize       + ")" +               "*/";    String stmtString = "select x "+ sqlTag + " from t1 where rownum <= ?";    PreparedStatement pstmt = null;    ResultSet rset = null;   try    {      pstmt = conn.prepareStatement( stmtString );      System.out.println( "\tDefault statement fetch size: " + pstmt.getFetchSize());      pstmt.setFetchSize( stmtLevelFetchSize );      System.out.println( "\tnew statement fetch size: " + pstmt.getFetchSize());      pstmt.setInt( 1, 100 );      rset = pstmt.executeQuery();      rset.setFetchSize( rsetLevelFetchSize );      System.out.println( "\tnew result set fetch size: " + rset.getFetchSize());      int i=0;      while (rset.next())      {      i++;      }      System.out.println( "\tnumber of times in the loop: " + i );    }    finally    {      // release JDBC related resources in the finally clause.      JDBCUtil.close( rset );      JDBCUtil.close( pstmt );    }}// demo fetch size using callable statementprivate static void _demoCstmtFetchSize( Connection conn, int connLevelDefaultPrefetch, int stmtLevelFetchSize ) throws SQLException{    System.out.println( "Inside _demoCstmtFetchSize" );    String sqlTag = "/*+" +                     "(CONN="+ connLevelDefaultPrefetch + ")" +                  "(CSTMT=" + stmtLevelFetchSize       + ")" +                  "*/";    String stmtString = "{ call prefetch_pkg.get_details ( ?, ?, ? ) }";    CallableStatement cstmt = null;    ResultSet rset = null;    try    {      cstmt = conn.prepareCall( stmtString );      System.out.println( "\tDefault statement fetch size: " + cstmt.getFetchSize());      cstmt.setFetchSize( stmtLevelFetchSize );      System.out.println( "\tnew statement fetch size: " + cstmt.getFetchSize());      cstmt.setInt( 1, 100); // number of rows to be fetched      cstmt.setString( 2, sqlTag );      cstmt.registerOutParameter( 3, OracleTypes.CURSOR );      // execute the query      cstmt.execute();      rset = (ResultSet) cstmt.getObject( 3 );      System.out.println( "\tresult set fetch size: " + rset.getFetchSize());      System.out.println( "\tHowever, in case of callable statement, the real fetch size for all result sets obtained from the statement is the same as the one set at the connection level." );      int i=0;      while (rset.next())      {      i++;      }      System.out.println( "\tnumber of times in the loop: " + i );    }    finally    {      // release JDBC related resources in the finally clause.      JDBCUtil.close( rset );      JDBCUtil.close( cstmt );    }}// demo fetch size using callable statementprivate static void _demoCstmtFetchSizeWithRsetOverride( Connection conn, int connLevelDefaultPrefetch, int stmtLevelFetchSize, int rsetLevelFetchSize ) throws SQLException{    System.out.println( "Inside _demoCstmtFetchSizeWithRsetOverride" );    String sqlTag = "/*+" +                     "(CONN="+ connLevelDefaultPrefetch + ")" +                  "(CSTMT=" + stmtLevelFetchSize       + ")" +                     "(RSET="+ rsetLevelFetchSize       + ")" +               "*/";    String stmtString = "{ call prefetch_pkg.get_details ( ?, ?, ? ) }";    CallableStatement cstmt = null;    ResultSet rset = null;    try    {      cstmt = conn.prepareCall( stmtString );      System.out.println( "\tDefault statement fetch size: " + cstmt.getFetchSize());      cstmt.setFetchSize( stmtLevelFetchSize );      System.out.println( "\tnew statement fetch size: " + cstmt.getFetchSize());      cstmt.setInt( 1, 100); // number of rows to be fetched      cstmt.setString( 2, sqlTag );      cstmt.registerOutParameter( 3, OracleTypes.CURSOR );      // execute the query      cstmt.execute();      rset = (ResultSet) cstmt.getObject( 3 );      rset.setFetchSize( rsetLevelFetchSize );      System.out.println( "\tnew result set fetch size: " + rset.getFetchSize());      System.out.println( "\tHowever, in case of callable statement, the real fetch size for all result sets obtained from the statement is the same as the one set at the connection level." );      int i=0;      while (rset.next())      {      i++;      }      System.out.println( "\tnumber of times in the loop: " + i );    }    finally    {      // release JDBC related resources in the finally clause.      JDBCUtil.close( rset );      JDBCUtil.close( cstmt );    }}} // end of program
上面是测试类
下面是tkporf 出来的文件,只摘取了相关数据

select x /*+(CONN=5)(PSTMT=20)(RSET=50)*/ from t1 where rownum <= :1call   count       cpu    elapsed       disk      query    current      rows------- -------------- ---------- ---------- ---------- --------------------Parse      1      0.00       0.00          0          0          0         0Execute      1      0.01       0.00          0          2          0         0Fetch      3      0.00       0.00          0          6          0         100------- -------------- ---------- ---------- ---------- --------------------total      5      0.01       0.00          0          8          0         100Misses in library cache during parse: 1Misses in library cache during execute: 1Optimizer mode: ALL_ROWSParsing user id: 62Rows   Row Source Operation----------------------------------------------------------    100COUNT STOPKEY (cr=6 pr=0 pw=0 time=1055 us)    100   TABLE ACCESS FULL T1 (cr=6 pr=0 pw=0 time=449 us)Elapsed times include waiting on following events:Event waited on                           Times   Max. WaitTotal Waited----------------------------------------   Waited----------------------SQL*Net message to client                     4      0.00          0.00SQL*Net message from client                     4      0.01          0.01********************************************************************************BEGIN prefetch_pkg.get_details ( :1, :2, :3 ) ; END;call   count       cpu    elapsed       disk      query    current      rows------- -------------- ---------- ---------- ---------- --------------------Parse      2      0.00       0.00          0          0          0         0Execute      2      0.04       0.05          0      276          0         2Fetch      0      0.00       0.00          0          0          0         0------- -------------- ---------- ---------- ---------- --------------------total      4      0.04       0.05          0      276          0         2Misses in library cache during parse: 0Optimizer mode: ALL_ROWSParsing user id: 62Elapsed times include waiting on following events:Event waited on                           Times   Max. WaitTotal Waited----------------------------------------   Waited----------------------SQL*Net message to client                     2      0.00          0.00SQL*Net message from client                     2      0.00          0.00********************************************************************************select /*+(CONN=5)(CSTMT=20)*/x from t1 where rownum <= :p_fetch_size call   count       cpu    elapsed       disk      query    current      rows------- -------------- ---------- ---------- ---------- --------------------Parse      1      0.00       0.00          0          0          0         0Execute      1      0.00       0.00          0          2          0         0Fetch       21      0.00       0.00          0         23          0         100------- -------------- ---------- ---------- ---------- --------------------total       23      0.00       0.00          0         25          0         100Misses in library cache during parse: 1Misses in library cache during execute: 1Optimizer mode: ALL_ROWSParsing user id: 62Rows   Row Source Operation----------------------------------------------------------    100COUNT STOPKEY (cr=23 pr=0 pw=0 time=1063 us)    100   TABLE ACCESS FULL T1 (cr=23 pr=0 pw=0 time=454 us)Elapsed times include waiting on following events:Event waited on                           Times   Max. WaitTotal Waited----------------------------------------   Waited----------------------SQL*Net message to client                      21      0.00          0.00SQL*Net message from client                  21      0.00          0.00********************************************************************************select /*+(CONN=5)(CSTMT=20)(RSET=50)*/x from t1 where rownum <= :p_fetch_size call   count       cpu    elapsed       disk      query    current      rows------- -------------- ---------- ---------- ---------- --------------------Parse      1      0.00       0.00          0          0          0         0Execute      1      0.00       0.00          0          2          0         0Fetch      3      0.00       0.00          0          5          0         100------- -------------- ---------- ---------- ---------- --------------------total      5      0.00       0.00          0          7          0         100Misses in library cache during parse: 1Misses in library cache during execute: 1Optimizer mode: ALL_ROWSParsing user id: 62Rows   Row Source Operation----------------------------------------------------------    100COUNT STOPKEY (cr=5 pr=0 pw=0 time=949 us)    100   TABLE ACCESS FULL T1 (cr=5 pr=0 pw=0 time=342 us)

代码已经很明显了,我就不多说了
页: [1]
查看完整版本: fetchSIze 对性能的影响