mirror of
https://github.com/MariaDB/server.git
synced 2025-04-18 21:44:20 +03:00
On FreeBSD, perl isn't in /usr/bin, its in /usr/local/bin or elsewhere in the path. Like storage/{maria/unittest/,}ma_test_* , we use /usr/bin/env to find perl and run it.
233 lines
6.1 KiB
Perl
Executable File
233 lines
6.1 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
# Copyright (C) 2000, 2003 MySQL AB
|
|
# Use is subject to license terms
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program 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 General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
|
|
|
|
use DBI;
|
|
use Benchmark;
|
|
|
|
$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;
|
|
|
|
chomp($pwd = `pwd`); $pwd = "." if ($pwd eq '');
|
|
require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n";
|
|
|
|
if ($opt_loop_count < 256)
|
|
{
|
|
$opt_loop_count=256; # Some tests must have some data to work!
|
|
}
|
|
|
|
if ($opt_small_test)
|
|
{
|
|
$opt_loop_count/=100;
|
|
$range_loop_count/=10;
|
|
$many_keys_loop_count=$opt_loop_count/10;
|
|
}
|
|
elsif ($opt_small_tables)
|
|
{
|
|
$opt_loop_count=10000; # number of rows/3
|
|
$many_keys_loop_count=$opt_loop_count;
|
|
}
|
|
elsif ($opt_small_key_tables)
|
|
{
|
|
$many_keys_loop_count/=10;
|
|
}
|
|
|
|
print "Testing the speed difference between some table types\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
|
|
####
|
|
|
|
$table_name="bench1";
|
|
test($table_name,"type=isam","char");
|
|
test($table_name,"type=myisam pack_keys=0","char");
|
|
test($table_name,"type=myisam pack_keys=0","char");
|
|
test($table_name,"type=myisam pack_keys=0 checksum=1","char");
|
|
test($table_name,"type=myisam pack_keys=1","char");
|
|
|
|
test($table_name,"type=isam","varchar");
|
|
test($table_name,"type=myisam pack_keys=1","varchar");
|
|
test($table_name,"type=myisam pack_keys=0","varchar");
|
|
test($table_name,"type=myisam pack_keys=0 checksum=1","varchar");
|
|
|
|
#test("type=heap","char"); # The default table sizes is a bit big for this one
|
|
|
|
$dbh->disconnect;
|
|
exit (0);
|
|
|
|
sub test {
|
|
my ($name,$options,$chartype)=@_;
|
|
|
|
print "\nTesting with options: '$options'\n";
|
|
$dbh->do("drop table $name");
|
|
do_many($dbh,$server->create("$name",
|
|
["id int NOT NULL",
|
|
"id2 int NOT NULL",
|
|
"id3 int NOT NULL",
|
|
"dummy1 $chartype(30)"],
|
|
["primary key (id,id2)",
|
|
"index index_id3 (id3)"],
|
|
$options));
|
|
|
|
if ($opt_lock_tables)
|
|
{
|
|
$sth = $dbh->do("LOCK TABLES $name WRITE") || die $DBI::errstr;
|
|
}
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(\$dbh,1);
|
|
}
|
|
|
|
####
|
|
#### Insert $total_rows records in order, in reverse order and random.
|
|
####
|
|
|
|
$loop_time=new Benchmark;
|
|
|
|
if ($opt_fast_insert)
|
|
{
|
|
$query="insert into $name values ";
|
|
}
|
|
else
|
|
{
|
|
$query="insert into $name (id,id2,id3,dummy1) values ";
|
|
}
|
|
|
|
if (($opt_fast || $opt_fast_insert) && $limits->{'multi_value_insert'})
|
|
{
|
|
$query_size=$server->{'limits'}->{'query_size'};
|
|
|
|
print "Inserting $opt_loop_count multiple-value rows in order\n";
|
|
$res=$query;
|
|
for ($i=0 ; $i < $opt_loop_count ; $i++)
|
|
{
|
|
$tmp= "($i,$i,$i,'ABCDEFGHIJ'),";
|
|
if (length($tmp)+length($res) < $query_size)
|
|
{
|
|
$res.= $tmp;
|
|
}
|
|
else
|
|
{
|
|
$sth = $dbh->do(substr($res,0,length($res)-1)) or die $DBI::errstr;
|
|
$res=$query . $tmp;
|
|
}
|
|
}
|
|
print "Inserting $opt_loop_count multiple-value rows in reverse order\n";
|
|
for ($i=0 ; $i < $opt_loop_count ; $i++)
|
|
{
|
|
$tmp= "(" . ($total_rows-1-$i) . "," .($total_rows-1-$i) .
|
|
"," .($total_rows-1-$i) . ",'BCDEFGHIJK'),";
|
|
if (length($tmp)+length($res) < $query_size)
|
|
{
|
|
$res.= $tmp;
|
|
}
|
|
else
|
|
{
|
|
$sth = $dbh->do(substr($res,0,length($res)-1)) or die $DBI::errstr;
|
|
$res=$query . $tmp;
|
|
}
|
|
}
|
|
print "Inserting $opt_loop_count multiple-value rows in random order\n";
|
|
for ($i=0 ; $i < $opt_loop_count ; $i++)
|
|
{
|
|
$tmp= "(" . $random[$i] . "," . $random[$i] . "," . $random[$i] .
|
|
",'CDEFGHIJKL')," or die $DBI::errstr;
|
|
if (length($tmp)+length($res) < $query_size)
|
|
{
|
|
$res.= $tmp;
|
|
}
|
|
else
|
|
{
|
|
$sth = $dbh->do(substr($res,0,length($res)-1)) or die $DBI::errstr;
|
|
$res=$query . $tmp;
|
|
}
|
|
}
|
|
$sth = $dbh->do(substr($res,0,length($res)-1)) or die $DBI::errstr;
|
|
}
|
|
else
|
|
{
|
|
print "Inserting $opt_loop_count rows in order\n";
|
|
for ($i=0 ; $i < $opt_loop_count ; $i++)
|
|
{
|
|
$sth = $dbh->do($query . "($i,$i,$i,'ABCDEFGHIJ')") or die $DBI::errstr;
|
|
}
|
|
|
|
print "Inserting $opt_loop_count rows in reverse order\n";
|
|
for ($i=0 ; $i < $opt_loop_count ; $i++)
|
|
{
|
|
$sth = $dbh->do($query . "(" . ($total_rows-1-$i) . "," .
|
|
($total_rows-1-$i) . "," .
|
|
($total_rows-1-$i) . ",'BCDEFGHIJK')")
|
|
or die $DBI::errstr;
|
|
}
|
|
|
|
print "Inserting $opt_loop_count rows in random order\n";
|
|
|
|
for ($i=0 ; $i < $opt_loop_count ; $i++)
|
|
{
|
|
$sth = $dbh->do($query . "(". $random[$i] . "," . $random[$i] .
|
|
"," . $random[$i] . ",'CDEFGHIJKL')") or die $DBI::errstr;
|
|
}
|
|
}
|
|
|
|
$end_time=new Benchmark;
|
|
print "Time for insert (" . ($total_rows) . "): " .
|
|
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(\$dbh,1);
|
|
}
|
|
|
|
$sth=$dbh->prepare("show table status like '$name'");
|
|
$sth->execute || die "Show table status returned error: $DBI::errstr\n";
|
|
while (@row = $sth->fetchrow_array)
|
|
{
|
|
print join("| ",@row) . " |\n";
|
|
}
|
|
$dbh->do("drop table $name") if (!$opt_skip_delete);
|
|
}
|