Hi,

I've changed my tests as you've proposed (the code at the bottom):
- I use the newest version: 1.0.78
- I use PreparedStatements
- I tried using h2.optimizeInJoin
- I set autocommit to false

My results:
- version change (1.0.76 -> 1.0.78) didn't change much
- prepared statements slightly decreased the performance
- autocommit set to false helped MySQL and didn't affect H2
- h2.optimizeIn didn't change the result
- h2.optimizeInJoin reduced the performance of the test case "B"
dramatically

Here is a result with h2.optimizeInJoin off:

Testing jdbc:h2:mem:test
Initialization [296ms]
A. SELECT pk FROM t WHERE pk = ? [31ms]
B. SELECT pk FROM t WHERE pk IN (?, ?) [997ms]
C. SELECT pk FROM t WHERE pk = ? OR pk = ? [3614ms]
D. SELECT pk FROM t WHERE pk = ? AND pk = ? [0ms]
E. SELECT pk FROM t WHERE pk = ? AND pk > ? [467ms]
Total [5405ms]
Testing jdbc:mysql://localhost:3306/test?user=test&password=test
Initialization [1495ms]
A. SELECT pk FROM t WHERE pk = ? [125ms]
B. SELECT pk FROM t WHERE pk IN (?, ?) [156ms]
C. SELECT pk FROM t WHERE pk = ? OR pk = ? [140ms]
D. SELECT pk FROM t WHERE pk = ? AND pk = ? [109ms]
E. SELECT pk FROM t WHERE pk = ? AND pk > ? [109ms]
Total [2134ms]

... and here with on:

Testing jdbc:h2:mem:test
Initialization [281ms]
A. SELECT pk FROM t WHERE pk = ? [46ms]
B. SELECT pk FROM t WHERE pk IN (?, ?) [40078ms]
C. SELECT pk FROM t WHERE pk = ? OR pk = ? [3631ms]
D. SELECT pk FROM t WHERE pk = ? AND pk = ? [0ms]
E. SELECT pk FROM t WHERE pk = ? AND pk > ? [467ms]
Total [44503ms]






package test;

import static java.lang.System.currentTimeMillis;
import static java.lang.System.out;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Random;

/**
 * @author [EMAIL PROTECTED] on 29 Aug 2008
 */
public class SearchByPKPerformance {

        public static void main(String[] args) throws SQLException {

//              System.setProperty("h2.optimizeIn", "true");
//              System.setProperty("h2.optimizeInJoin", "true");

                DriverManager.registerDriver(new org.h2.Driver());
                DriverManager.registerDriver(new com.mysql.jdbc.Driver());

                String h2url = "jdbc:h2:mem:test";
                String mysqlUrl = "jdbc:mysql://localhost:3306/test?
user=test&password=test";

                for (String url : Arrays.asList(h2url, mysqlUrl)) {

                        Random rnd = new Random(1234);

                        out.println("Testing " + url);

                        long start = currentTimeMillis();

                        Connection conn = DriverManager.getConnection(url);
                        conn.setAutoCommit(false);

                        Statement stmt = conn.createStatement();

                        stmt.execute("DROP TABLE IF EXISTS t");
                        stmt.execute("CREATE TABLE t (pk INT, PRIMARY KEY 
(pk))");

                        PreparedStatement pstmt = conn.prepareStatement("INSERT 
INTO t (pk)
VALUES (?)");
                        for (int i = 0; i < 10000; i++) {
                                pstmt.setInt(1, rnd.nextInt());
                                pstmt.executeUpdate();
                        }
                        out.println("Initialization [" + (currentTimeMillis() - 
start) +
"ms]");
                        pstmt.close();

                        run(rnd, conn, "SELECT pk FROM t WHERE pk = ?", "A", 1);
                        run(rnd, conn, "SELECT pk FROM t WHERE pk IN (?, ?)", 
"B", 2);
                        run(rnd, conn, "SELECT pk FROM t WHERE pk = ? OR pk = 
?", "C", 2);
                        run(rnd, conn, "SELECT pk FROM t WHERE pk = ? AND pk = 
?", "D", 2);
                        run(rnd, conn, "SELECT pk FROM t WHERE pk = ? AND pk > 
?", "E", 2);

                        out.println("Total [" + (currentTimeMillis() - start) + 
"ms]");

                }

        }

        private static void run(Random rnd, Connection conn, String sql,
String tst, int params)
                        throws SQLException {
                long start = currentTimeMillis();
                PreparedStatement pstmt = conn.prepareStatement(sql);
                for (int i = 0; i < 1000; i++) {
                        for (int j = 1; j <= params; j++)
                                pstmt.setInt(j, rnd.nextInt());
                        pstmt.executeQuery();
                }
                out.println(tst + ". " + sql + " [" + (currentTimeMillis() - 
start)
+ "ms]");
                pstmt.close();
        }

}

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to