2 import java
.util
.Random
;
5 public static Random generator
= new Random();
6 public static int getRandom(int end
)
8 double val
= generator
.nextDouble();
13 public static int singleTuple(Connection con
, boolean flag
)throws Exception
15 PreparedStatement stmt
= null ;
18 String buf
= "SELECT unique1, unique2, stringu1, stringu2 from big1 where unique1=?";
21 String buf
= "SELECT unique1, unique2, stringu1, stringu2 from big1 where stringu1=?";
25 stmt
= con
.prepareStatement(stmtStr
);
26 int count
=0, recordCount
=0;
28 long start
=0, end
=0, curr
=0;
31 int searchVal
[] = {1, 10, 100, 500, 1000, 5000 ,7500, 8000, 9000, 9999};
33 for(int i
=0; i
<10; i
++) {
34 start
= System
.nanoTime();
36 stmt
.setInt(1, searchVal
[i
]);
38 stmt
.setString(1, "Value" +searchVal
[i
]);
39 rs
= stmt
.executeQuery();
47 end
= System
.nanoTime();
50 System
.out
.println("No of records for:"+ stmtStr
+""+ recordCount
);
60 return (int)tot
/10/1000;
65 public static int onePerSel(Connection con
) throws Exception
67 PreparedStatement stmt
= null;
70 String buf
= "SELECT unique1, unique2, stringu1 from big1 where unique1 between ? and ?";
72 stmt
= con
.prepareStatement(stmtStr
);
73 int count
=0, recordCount
=0;
75 long start
=0, end
=0, curr
=0;
78 int searchVal
[] = {1, 5, 10, 50, 100, 500, 1000, 5000 ,7500, 9500};
79 for (int i
=0 ; i
< 10 ; i
++) {
80 start
= System
.nanoTime();
81 stmt
.setInt(1, searchVal
[i
]);
82 stmt
.setInt(2, searchVal
[i
] +99);
83 rs
= stmt
.executeQuery();
92 end
= System
.nanoTime();
95 if (recordCount
!= 100)
97 System
.out
.println("No. of records for:"+ stmtStr
+" "+recordCount
);
106 return (int)tot
/10/1000;
110 public static int orderby(Connection con
) throws Exception
112 PreparedStatement stmt
= null;
114 String buf
= "SELECT two, four, ten, twenty, onepercent, string4 from big1 where unique1 between ? and ? order by unique1";
117 stmt
= con
.prepareStatement(stmtStr
);
118 int count
=0, recordCount
=0;
120 long start
=0, end
=0, curr
=0;
123 int searchVal
[] = {1, 5, 10, 50, 100, 500, 1000, 5000 ,7500, 9500};
124 for (int i
=0 ; i
< 10 ; i
++) {
125 start
= System
.nanoTime();
126 stmt
.setInt(1, searchVal
[i
]);
127 stmt
.setInt(2, searchVal
[i
] +99);
128 rs
= stmt
.executeQuery();
137 end
= System
.nanoTime();
140 if (recordCount
!= 100)
142 System
.out
.println("No. of records for"+ stmtStr
+" "+recordCount
);
151 return (int)tot
/10/1000;
156 public static int distinct(Connection con
) throws Exception
158 PreparedStatement stmt
= null;
160 //String buf = "SELECT DISTINCT two, four, ten, twenty, onepercent, string4 FROM big1;";
161 String buf
= "SELECT DISTINCT onepercent FROM big1";
163 stmt
= con
.prepareStatement(stmtStr
);
164 int count
=0, recordCount
=0;
166 long start
=0, end
=0, curr
=0;
169 for (int i
=0 ; i
< 10 ; i
++) {
170 start
= System
.nanoTime();
171 rs
= stmt
.executeQuery();
180 end
= System
.nanoTime();
182 if (recordCount
!= 100)
184 System
.out
.println("No. of records for" + stmtStr
+ " "+recordCount
);
193 return (int)tot
/10/1000;
198 public static int aggregate(Connection con
, int val
,boolean flag
)throws Exception
200 PreparedStatement stmt
= null;
204 String buf
= "SELECT MIN(unique1) from big1";
207 else if(val
==1 && flag
)
210 String buf
= "SELECT MIN(unique1) from big1 group by onepercent";
217 String buf
= "SELECT MAX(unique1) from big1";
220 else if(val
==2 && flag
)
223 String buf
= "SELECT MAX(unique1) from big1 group by onepercent";
227 else if(val
==3 && !flag
)
230 String buf
= "SELECT SUM(unique1) from big1";
233 else if (val
==3 && flag
)
236 String buf
= "SELECT SUM(unique1) from big1 group by onepercent";
239 stmt
= con
.prepareStatement(stmtStr
);
240 int count
= 0, recordCount
;
242 long start
= 0,end
= 0,curr
= 0;
246 for(int i
=0;i
<10;i
++){
247 start
= System
.nanoTime();
248 rs
= stmt
.executeQuery();
257 end
= System
.nanoTime();
259 if(!flag
&& recordCount
!=1)
261 System
.out
.println("No. of records for "+ stmtStr
+ " "+recordCount
);
263 }else if (flag
&& recordCount
!=100)
265 System
.out
.println("No. of records for "+ stmtStr
+ " "+ recordCount
);
273 return (int)tot
/10/1000;
278 public static int dmlstatement(Connection con
, int val
)throws Exception
280 PreparedStatement stmt
= null;
284 String buf
= "insert into big1 values(?,?,0,2,0,10,50,688,1950,4950,9950,1,100,'MXXXXXXXXXXXXXXXXXXXXXXXXXGXXXXXXXXXXXXXXXXXXXXXXXXC','GXXXXXXXXXXXXXXXXXXXXXXXXXCXXXXXXXXXXXXXXXXXXXXXXXXA','OXXXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXXXXXXXXXO')";
289 String buf
= "UPDATE big1 SET two=1 WHERE unique1=?";
294 String buf
= "DELETE FROM big1 WHERE unique1=?";
298 stmt
= con
.prepareStatement(stmtStr
);
299 int count
= 0, recordCount
=0;
301 long start
= 0,end
= 0,curr
= 0;
303 for(int i
=0; i
<100; i
++){
304 stmt
.setInt(1, 10000+i
);
305 if (val
==1) stmt
.setInt(2, 10000+i
);
306 start
= System
.nanoTime();
307 ret
= stmt
.executeUpdate();
311 end
= System
.nanoTime();
317 return (int)tot
/100/1000;
322 public static int joining(Connection con
,int val
)throws Exception
324 PreparedStatement stmt
= null;
325 String stmtStr
= null;
328 String buf
= "SELECT big1.unique1, big1.unique2, small.unique1, small.stringu1 FROM big1,small WHERE big1.unique2=small.unique1 AND big1.unique1=?";
333 String buf
= "SELECT small.unique1, big1.unique1, big2.unique1, small.stringu1, big1.unique2, big2.unique2 FROM big1, big2, small WHERE big1.unique2 = small.unique1 AND big1.unique2=big2.unique1 AND big1.unique1 = ?";
337 stmt
= con
.prepareStatement(stmtStr
);
338 int count
=0,recordCount
=0,ret
=0;
339 long start
=0,end
=0,curr
=0;
342 int searchVal
[] = {1, 5, 10, 50, 100, 250, 500, 750, 900, 999};
343 for(int i
=0;i
<10;i
++)
346 start
= System
.nanoTime();
347 stmt
.setInt(1, searchVal
[i
]);
348 rs
= stmt
.executeQuery();
351 // System.out.println("Record:"+ rs.getInt(1)+ " "+ rs.getInt(2)+" " +rs.getInt(3)+ " "+ rs.getString(4));
356 end
=System
.nanoTime();
359 System
.out
.println("No. of records in"+ stmtStr
+" "+ recordCount
);
368 return (int)tot
/10/1000;
371 static long joinCondition(Connection con
,int val
)throws Exception
374 PreparedStatement stmt
= null;
375 String stmtStr
= null;
378 String buf
= "SELECT big1.unique1, big1.unique2, small.unique1, small.stringu1 FROM big1,small WHERE big1.unique2=small.unique1 AND big1.unique1 > ? AND big1.unique1 <= ?";
383 String buf
= "SELECT small.unique1, big1.unique1, big2.unique1, small.stringu1, big1.unique2, big2.unique2 FROM big1, big2, small WHERE big1.unique2=small.unique1 AND big1.unique2=big2.unique1 AND big1.unique1 > ? and big1.unique1 <= ?";
387 stmt
= con
.prepareStatement(stmtStr
);
388 int count
=0,recordCount
=0,ret
=0;
389 long start
=0,end
=0,curr
=0;
392 int searchVal
[] = {1, 5, 10, 50, 100, 200, 250, 500, 750, 800};
393 for(int i
=0;i
<10;i
++)
396 start
= System
.nanoTime();
397 stmt
.setInt(1, searchVal
[i
]);
398 stmt
.setInt(2, searchVal
[i
]+100);
399 rs
= stmt
.executeQuery();
402 //System.out.println("Record:"+ rs.getInt(1)+ " "+ rs.getInt(2)+" " +rs.getInt(3)+ " "+ rs.getString(4));
407 end
=System
.nanoTime();
410 System
.out
.println("No. of records in"+ stmtStr
+" "+ recordCount
);
424 //*****************************************************
425 public static void main(String
[] args
)
429 if (args
.length
== 3)
431 if (args
[0].equals("csql")) flag
=1;
432 else if (args
[0].equals("mysql")) flag
=2;
433 else if (args
[0].equals("postgres")) flag
=3;
434 else if (args
[0].equals("oracle")) flag
=4;
435 else if (args
[0].equals("sybase")) flag
=5;
438 System
.out
.println("Usage: java JDBCBench <DBNAME> <username> <password>");
443 Connection con
= null;
445 Class
.forName("csql.jdbc.JdbcSqlDriver");
446 con
= DriverManager
.getConnection("jdbc:csql", args
[1], args
[2]);
447 } else if (flag
== 2) {
448 Class
.forName("com.mysql.jdbc.Driver");
449 con
= DriverManager
.getConnection("jdbc:mysql://localhost/test", args
[1], args
[2]);
450 } else if (flag
== 3) {
451 Class
.forName("org.postgresql.Driver");
452 con
= DriverManager
.getConnection("jdbc:postgresql://localhost/test", args
[1], args
[2]);
453 } else if (flag
== 4) {
454 Class
.forName("oracle.jdbc.driver.OracleDriver");
455 con
= DriverManager
.getConnection("jdbc:oracle:thin:@localhost:1521:XE", args
[1], args
[2]);
456 } else if (flag
== 5) {
457 Class
.forName("com.sybase.jdbc3.jdbc.SybDataSource");
458 con
= DriverManager
.getConnection("jdbc:sybase:Tds:localhost:4112", args
[1], args
[2]);
460 con
.setAutoCommit(false);
461 con
.setTransactionIsolation(Connection
.TRANSACTION_READ_COMMITTED
);
462 Statement cStmt
= con
.createStatement();
464 long timeTaken
[][] = new long[20][3];
465 int ins
=1,upd
=2,del
=3;// function parameter
466 int min
=1, max
=2,sum
=3;// function parameter
469 timeTaken
[0][0] = singleTuple(con
, true);
470 timeTaken
[1][0] = singleTuple(con
, false);
472 timeTaken
[2][0] = onePerSel(con
);
473 timeTaken
[3][0] = aggregate(con
,min
,false);
474 timeTaken
[4][0] = aggregate(con
,min
,true);
475 timeTaken
[5][0] = aggregate(con
,max
,false);
476 timeTaken
[6][0] = aggregate(con
,max
,true);
478 timeTaken
[7][0] = aggregate(con
,sum
,false);
479 timeTaken
[8][0] = aggregate(con
,sum
,true);
480 timeTaken
[9][0] = distinct(con
);
481 timeTaken
[10][0] = orderby(con
);
483 timeTaken
[11][0] = dmlstatement(con
,ins
);
484 timeTaken
[12][0] = dmlstatement(con
,upd
);
485 timeTaken
[13][0] = dmlstatement(con
,del
);
486 timeTaken
[14][0] = joining(con
,1);
487 timeTaken
[15][0] = joining(con
,2);
488 timeTaken
[16][0] = joinCondition(con
,1);
489 timeTaken
[17][0] = joinCondition(con
,2);
490 System
.out
.println("Finished no index queries");
494 cStmt
.execute("FLUSH CACHE");
497 }catch(Exception e
){e
.printStackTrace(); System
.out
.println("Error creating index");}
501 cStmt
.execute("CREATE INDEX idx1 ON big1(unique1) HASH");
503 cStmt
.execute("CREATE INDEX idx2 ON big2(unique1) HASH");
505 cStmt
.execute("CREATE INDEX idx3 ON small(unique1) HASH");
507 cStmt
.execute("CREATE INDEX idx4 ON big1(stringu1) HASH");
510 }else if (flag
==2) {
511 cStmt
.execute("CREATE INDEX mysqld1 USING HASH ON big1(unique1)");
512 cStmt
.execute("CREATE INDEX mysqld2 USING HASH ON big2(unique1)");
513 cStmt
.execute("CREATE INDEX mysqld3 USING HASH ON small(unique1)");
514 cStmt
.execute("CREATE INDEX mysqld4 USING HASH ON big1(stringu1)");
516 } else if (flag
== 3) {
517 cStmt
.execute("CREATE INDEX psqld1 on big1 USING HASH (unique1)");
518 cStmt
.execute("CREATE INDEX psqld2 on big2 USING HASH (unique1)");
519 cStmt
.execute("CREATE INDEX psqld3 on small USING HASH (unique1)");
520 cStmt
.execute("CREATE INDEX psqld4 on big1 USING HASH (stringu1)");
523 catch(Exception e
){e
.printStackTrace(); System
.out
.println("Error creating index");}
524 timeTaken
[0][1] = singleTuple(con
, true);
525 timeTaken
[1][1] = singleTuple(con
, false);
534 timeTaken
[10][1] = orderby(con
);
536 timeTaken
[11][1] = dmlstatement(con
,ins
);
537 timeTaken
[12][1] = dmlstatement(con
,upd
);
538 timeTaken
[13][1] = dmlstatement(con
,del
);
539 timeTaken
[14][1] = joining(con
,1);
540 timeTaken
[15][1] = joining(con
,2);
541 timeTaken
[16][1] = joinCondition(con
,1);
542 timeTaken
[17][1] = joinCondition(con
,2);
543 System
.out
.println("Finished hash index queries");
548 cStmt
.execute("FLUSH CACHE");
551 }catch(Exception e
){e
.printStackTrace(); System
.out
.println("Error creating index");}
556 cStmt
.execute("DROP INDEX idx1");
558 cStmt
.execute("DROP INDEX idx2");
560 cStmt
.execute("DROP INDEX idx3");
562 cStmt
.execute("DROP INDEX idx4");
564 cStmt
.execute("CREATE INDEX idx5 ON big1(unique1) TREE");
565 cStmt
.execute("CREATE INDEX idx6 ON big2(unique1) TREE");
566 cStmt
.execute("CREATE INDEX idx7 ON small(unique1) TREE");
567 cStmt
.execute("CREATE INDEX idx8 ON big1(stringu1) TREE");
569 }else if (flag
==2) {
570 cStmt
.execute("DROP INDEX mysqld1 on big1");
571 cStmt
.execute("DROP INDEX mysqld2 on big2");
572 cStmt
.execute("DROP INDEX mysqld3 on small");
573 cStmt
.execute("DROP INDEX mysqld4 on big1");
574 cStmt
.execute("CREATE INDEX mysqld5 USING BTREE ON big1(unique1)");
575 cStmt
.execute("CREATE INDEX mysqld6 USING BTREE ON big2(unique1)");
576 cStmt
.execute("CREATE INDEX mysqld7 USING BTREE ON small(unique1)");
577 cStmt
.execute("CREATE INDEX mysqld8 USING BTREE ON big1(stringu1)");
579 } else if (flag
== 3) {
580 cStmt
.execute("DROP INDEX psqld1");
581 cStmt
.execute("DROP INDEX psqld2");
582 cStmt
.execute("DROP INDEX psqld3");
583 cStmt
.execute("DROP INDEX psqld4");
584 cStmt
.execute("CREATE INDEX psqld5 on big1 USING BTREE (unique1)");
585 cStmt
.execute("CREATE INDEX psqld6 on big2 USING BTREE (unique1)");
586 cStmt
.execute("CREATE INDEX psqld7 on small USING BTREE (unique1)");
587 cStmt
.execute("CREATE INDEX psqld8 on big1 USING BTREE (stringu1)");
590 }catch(Exception e
){e
.printStackTrace(); System
.out
.println("Error creating index");}
592 timeTaken
[0][2] = singleTuple(con
, true);
593 timeTaken
[1][2] = singleTuple(con
, false);
594 timeTaken
[2][2] = onePerSel(con
);
595 timeTaken
[3][2] = aggregate(con
,min
,false);
596 timeTaken
[4][2] = aggregate(con
,min
,true);
597 timeTaken
[5][2] = aggregate(con
,max
,false);
598 timeTaken
[6][2] = aggregate(con
,max
,true);
602 timeTaken
[10][2] = orderby(con
);
603 timeTaken
[11][2] = dmlstatement(con
,ins
);
604 timeTaken
[12][2] = dmlstatement(con
,upd
);
605 timeTaken
[13][2] = dmlstatement(con
,del
);
606 timeTaken
[14][2] = joining(con
,1);
607 timeTaken
[15][2] = joining(con
,2);
608 timeTaken
[16][2] = joinCondition(con
,1);
609 timeTaken
[17][2] = joinCondition(con
,2);
610 System
.out
.println("Finished tree index queries");
616 cStmt
.execute("DROP INDEX idx5");
618 cStmt
.execute("DROP INDEX idx6");
620 cStmt
.execute("DROP INDEX idx7");
622 cStmt
.execute("DROP INDEX idx8");
625 } else if (flag
==2) {
626 cStmt
.execute("DROP INDEX mysqld5 on big1");
627 cStmt
.execute("DROP INDEX mysqld6 on big2");
628 cStmt
.execute("DROP INDEX mysqld7 on small");
629 cStmt
.execute("DROP INDEX mysqld8 on big1");
631 } else if (flag
==3) {
632 cStmt
.execute("DROP INDEX psqld5");
633 cStmt
.execute("DROP INDEX psqld6");
634 cStmt
.execute("DROP INDEX psqld7");
635 cStmt
.execute("DROP INDEX psqld8");
638 }catch(Exception e
){System
.out
.println("Error dropping indexes");}
640 System
.out
.println("Wisconsin Benchmark Report:");
642 System
.out
.println("**********************************************************");
643 System
.out
.println(" Statement \t NoIndex\tHash \tTree");
644 System
.out
.println("**********************************************************");
645 System
.out
.println(" SelectInt 1 \t "+timeTaken
[0][0] +" \t \t"+ timeTaken
[0][1]+ " \t"+ timeTaken
[0][2]);
646 System
.out
.println(" SelectStr 1 \t "+timeTaken
[1][0] +" \t \t"+ timeTaken
[1][1]+ " \t"+ timeTaken
[1][2]);
647 System
.out
.println(" 1% Sel \t "+timeTaken
[2][0] +" \t \t- \t"+ timeTaken
[2][2]);
649 System
.out
.println(" Min 1 \t "+timeTaken
[3][0] +" \t \t- \t"+ timeTaken
[3][2]);
650 System
.out
.println(" Min_GrBy 1% \t "+timeTaken
[4][0] +" \t \t- \t-");
652 System
.out
.println(" Max 1 \t "+timeTaken
[5][0] +" \t \t- \t"+ timeTaken
[5][2]);
653 System
.out
.println(" Max_GrBy 1% \t "+timeTaken
[6][0] +" \t \t- \t-");
655 System
.out
.println(" Sum 1 \t "+timeTaken
[7][0] +" \t \t- \t-");
656 System
.out
.println(" Sum_GrBy 1% \t "+timeTaken
[8][0] +" \t \t- \t-");
658 System
.out
.println(" Distinct 1% \t "+timeTaken
[9][0] +" \t \t- \t-");
659 System
.out
.println(" OrderBy 1% \t "+timeTaken
[10][0] +" \t \t"+ timeTaken
[10][1]+ " \t"+ timeTaken
[10][2]);
661 System
.out
.println(" Insert 1 \t "+timeTaken
[11][0] +" \t \t"+ timeTaken
[11][1]+ " \t"+ timeTaken
[11][2]);
662 System
.out
.println(" Update 1 \t "+timeTaken
[12][0] +" \t \t"+ timeTaken
[12][1]+ " \t"+ timeTaken
[12][2]);
663 System
.out
.println(" Delete 1 \t "+timeTaken
[13][0] +" \t \t"+ timeTaken
[13][1]+ " \t"+ timeTaken
[13][2]);
664 System
.out
.println(" Join(10K*1K)1 \t "+timeTaken
[14][0] +" \t \t"+ timeTaken
[14][1]+ "\t"+ timeTaken
[14][2]);
665 System
.out
.println(" Join(10K*10K*1K)1\t "+timeTaken
[15][0] +"\t \t"+ timeTaken
[15][1]+ "\t"+ timeTaken
[15][2]);
667 System
.out
.println(" Join(10K*1K)100 \t "+timeTaken
[16][0]+"\t \t"+ timeTaken
[16][1]+ "\t"+ timeTaken
[16][2]);
668 System
.out
.println(" Join(10K*10K*1K)100\t "+timeTaken
[17][0] +"\t \t"+ timeTaken
[17][1]+ "\t"+ timeTaken
[17][2]);
670 System
.out
.println("**********************************************************");
674 System
.out
.println("Exception in Test: "+e
);