#!/usr/bin/perl # Copyright (C) 2000-2003 MySQL AB # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; version 2 # of the License. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, # MA 02111-1307, USA # # Test of creating a simple table and inserting $record_count records in it, # $opt_loop_count rows in order, $opt_loop_count rows in reverse order and # $opt_loop_count rows in random order # # changes made for Oracle compatibility # - $limits->{'func_odbc_mod'} is OK from crash-me, but it fails here so set we # set it to 0 in server-cfg # - the default server config runs out of rollback segments, so we added a # couple of disconnect/connects to reset # ##################### Standard benchmark inits ############################## use Cwd; use DBI; use Benchmark; use Data::Dumper; $opt_loop_count=100000; # number of rows/3 $small_loop_count=10; # Loop for full table retrieval $range_loop_count=$small_loop_count*50; $many_keys_loop_count=$opt_loop_count; $opt_read_key_loop_count=$opt_loop_count; $pwd = cwd(); $pwd = "." if ($pwd eq ''); require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n"; if ($opt_small_test) { $opt_loop_count/=100; $many_keys_loop_count=$opt_loop_count/10; $range_loop_count=10; $opt_read_key_loop_count=10; } elsif ($opt_small_tables) { $opt_loop_count=10000; # number of rows/3 $many_keys_loop_count=$opt_loop_count; $opt_read_key_loop_count=10; } elsif ($opt_small_key_tables) { $many_keys_loop_count/=10; } if ($opt_loop_count < 100) { $opt_loop_count=100; # Some tests must have some data to work! } $range_loop_count=min($opt_loop_count,$range_loop_count); print "Testing the speed of inserting data into 1 table and do some selects on it.\n"; print "The tests are done with a table that has $opt_loop_count rows.\n\n"; #### #### Generating random keys #### print "Generating random keys\n"; $random[$opt_loop_count]=0; for ($i=0 ; $i < $opt_loop_count ; $i++) { $random[$i]=$i+$opt_loop_count; } my $tmpvar=1; for ($i=0 ; $i < $opt_loop_count ; $i++) { $tmpvar^= ((($tmpvar + 63) + $i)*3 % $opt_loop_count); $swap=$tmpvar % $opt_loop_count; $tmp=$random[$i]; $random[$i]=$random[$swap]; $random[$swap]=$tmp; } $total_rows=$opt_loop_count*3; #### #### Connect and start timeing #### $start_time=new Benchmark; $dbh = $server->connect(); #### #### Create needed tables #### $sth = $dbh->do("drop table if exists bench1" . $server->{'drop_attr'}) or die $DBI::errstr; if ($opt_fast && defined($server->{vacuum})) { $server->vacuum(1,\$dbh); } # # Test multi value inserts if the server supports it # if ($limits->{'insert_multi_value'}) { $query_size=$limits->{'query_size'}; # Same limit for all databases $sth = $dbh->do("drop table bench1" . $server->{'drop_attr'}); do_many($dbh,$server->create("bench1", ["id int NOT NULL", "id2 int NOT NULL", "id3 int NOT NULL", "dummy1 char(30)"], ["primary key (id,id2)", "index index_id3 (id3)"])); $loop_time=new Benchmark; if ($opt_lock_tables) { $sth = $dbh->do("LOCK TABLES bench1 write") || die $DBI::errstr; } if ($opt_fast && $server->{transactions}) { $dbh->{AutoCommit} = 0; } print "Inserting $opt_loop_count rows with multiple values\n"; $query="insert into bench1 values "; $res=$query; for ($i=0 ; $i < $opt_loop_count ; $i++) { my $tmp= "($i,$i,$i,'EFGHIJKLM'),"; if (length($i)+length($res) < $query_size) { $res.= $tmp; } else { do_query($dbh,substr($res,0,length($res)-1)); $res=$query .$tmp; } } do_query($dbh,substr($res,0,length($res)-1)); if ($opt_lock_tables) { $sth = $dbh->do("UNLOCK TABLES ") || die $DBI::errstr; } if ($opt_fast && $server->{transactions}) { $dbh->commit; $dbh->{AutoCommit} = 1; } $end_time=new Benchmark; print "Time for multiple_value_insert (" . ($opt_loop_count) . "): " . timestr(timediff($end_time, $loop_time),"all") . "\n\n"; if ($opt_lock_tables) { $sth = $dbh->do("UNLOCK TABLES ") || die $DBI::errstr; } # A big table may take a while to drop $loop_time=new Benchmark; $sth = $dbh->do("drop table bench1" . $server->{'drop_attr'}) or die $DBI::errstr; $end_time=new Benchmark; print "Time for drop table(1): " . timestr(timediff($end_time, $loop_time),"all") . "\n\n"; } #### #### End of benchmark #### $dbh->disconnect; # close connection end_benchmark($start_time);