mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
37c88445e3
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.
277 lines
7 KiB
Bash
277 lines
7 KiB
Bash
#!/usr/bin/env perl
|
|
# Copyright (c) 2000-2003, 2006 MySQL AB, 2009 Sun Microsystems, Inc.
|
|
# Use is subject to license terms.
|
|
#
|
|
# 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., 51 Franklin St, Fifth Floor, Boston,
|
|
# MA 02110-1335 USA
|
|
#
|
|
# This test is for testing how long it takes to create tables,
|
|
# make a count(*) from them and finally drop the tables. These
|
|
# commands will be done in different ways in this test.
|
|
# Using option --fast will drop all the tables in the end
|
|
# of this test with one command instead of making own
|
|
# 'drop' command for each and every table.
|
|
# By changing the variable '$table_amount' value you can make
|
|
# this test a lot harder/easier for your computer to drive.
|
|
# Note that when using value bigger than 64 for this variable
|
|
# will do 'drop table'-command in totally different way because of that
|
|
# how MySQL handles these commands.
|
|
|
|
##################### Standard benchmark inits ##############################
|
|
|
|
use Cwd;
|
|
use DBI;
|
|
use Benchmark;
|
|
|
|
$opt_loop_count=10000; # Change this to make test harder/easier
|
|
# This is the default value for the amount of tables used in this test.
|
|
|
|
$pwd = cwd(); $pwd = "." if ($pwd eq '');
|
|
require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n";
|
|
|
|
$create_loop_count=$opt_loop_count;
|
|
if ($opt_small_test)
|
|
{
|
|
$opt_loop_count/=100;
|
|
$create_loop_count/=1000;
|
|
}
|
|
|
|
if ($opt_temporary_tables)
|
|
{
|
|
$max_tables=min($limits->{'max_tables'},$opt_loop_count);
|
|
}
|
|
else
|
|
{
|
|
$max_tables=min($limits->{'max_tables'},$opt_loop_count);
|
|
$max_tables=400;
|
|
}
|
|
|
|
if ($opt_small_test)
|
|
{
|
|
$max_tables=10;
|
|
}
|
|
|
|
|
|
print "Testing the speed of creating and dropping tables\n";
|
|
print "Testing with $max_tables tables and $opt_loop_count loop count\n\n";
|
|
|
|
####
|
|
#### Connect and start timeing
|
|
####
|
|
|
|
$dbh = $server->connect();
|
|
|
|
### Test how the database can handle many tables
|
|
### Create $max_tables ; Access all off them with a simple query
|
|
### and then drop the tables
|
|
|
|
if ($opt_force) # If tables used in this test exist, drop 'em
|
|
{
|
|
print "Okay..Let's make sure that our tables don't exist yet.\n\n";
|
|
for ($i=1 ; $i <= max($max_tables, $create_loop_count) ; $i++)
|
|
{
|
|
$dbh->do("drop table bench_$i" . $server->{'drop_attr'});
|
|
}
|
|
}
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(1,\$dbh);
|
|
}
|
|
|
|
print "Testing create of tables\n";
|
|
|
|
$loop_time=$start_time=new Benchmark;
|
|
|
|
for ($i=1 ; $i <= $max_tables ; $i++)
|
|
{
|
|
if (do_many($dbh,$server->create("bench_$i",
|
|
["i int NOT NULL",
|
|
"d double",
|
|
"f float",
|
|
"s char(10)",
|
|
"v varchar(100)"],
|
|
["primary key (i)"])))
|
|
{
|
|
# Got an error; Do cleanup
|
|
for ($i=1 ; $i <= $max_tables ; $i++)
|
|
{
|
|
$dbh->do("drop table bench_$i" . $server->{'drop_attr'});
|
|
}
|
|
die "Test aborted";
|
|
}
|
|
}
|
|
|
|
$end_time=new Benchmark;
|
|
print "Time for create_MANY_tables ($max_tables): " .
|
|
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(1,\$dbh);
|
|
}
|
|
|
|
#### Here comes $max_tables couples of cont(*) to the tables.
|
|
#### We'll check how long it will take...
|
|
####
|
|
|
|
print "Accessing tables\n";
|
|
|
|
if ($limits->{'group_functions'})
|
|
{
|
|
$query="select count(*) from ";
|
|
$type="select_group_when_MANY_tables";
|
|
}
|
|
else
|
|
{
|
|
$query="select * from ";
|
|
$type="select_when_MANY_tables";
|
|
}
|
|
|
|
$loop_time=new Benchmark;
|
|
for ($i=1 ; $i <= $max_tables ; $i++)
|
|
{
|
|
$sth = $dbh->do("$query bench_$i") or die $DBI::errstr;
|
|
}
|
|
|
|
$end_time=new Benchmark;
|
|
print "Time to $type ($max_tables): " .
|
|
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
|
|
|
|
####
|
|
#### Now we are going to drop $max_tables tables;
|
|
####
|
|
|
|
print "Testing drop\n";
|
|
|
|
$loop_time=new Benchmark;
|
|
|
|
if ($opt_fast && $server->{'limits'}->{'multi_drop'} &&
|
|
$server->{'limits'}->{'query_size'} > 11+$max_tables*10)
|
|
{
|
|
my $query="drop table bench_1";
|
|
for ($i=2 ; $i <= $max_tables ; $i++)
|
|
{
|
|
$query.=",bench_$i";
|
|
}
|
|
$sth = $dbh->do($query . $server->{'drop_attr'}) or die $DBI::errstr;
|
|
}
|
|
else
|
|
{
|
|
for ($i=1 ; $i <= $max_tables ; $i++)
|
|
{
|
|
$sth = $dbh->do("drop table bench_$i" . $server->{'drop_attr'})
|
|
or die $DBI::errstr;
|
|
}
|
|
}
|
|
|
|
|
|
$end_time=new Benchmark;
|
|
print "Time for drop_table_when_MANY_tables ($max_tables): " .
|
|
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(1,\$dbh);
|
|
}
|
|
|
|
#### We'll do first one 'create table' and then we'll drop it
|
|
#### away immediately. This loop shall be executed $opt_loop_count
|
|
#### times.
|
|
|
|
print "Testing create+drop\n";
|
|
|
|
$loop_time=new Benchmark;
|
|
|
|
for ($i=1 ; $i <= $create_loop_count ; $i++)
|
|
{
|
|
do_many($dbh,$server->create("bench_$i",
|
|
["i int NOT NULL",
|
|
"d double",
|
|
"f float",
|
|
"s char(10)",
|
|
"v varchar(100)"],
|
|
["primary key (i)"]));
|
|
$sth = $dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;
|
|
}
|
|
|
|
$end_time=new Benchmark;
|
|
print "Time for create+drop ($create_loop_count): " .
|
|
timestr(timediff($end_time, $loop_time),"all") . "\n";
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(1,\$dbh);
|
|
}
|
|
|
|
#
|
|
# Same test, but with a table with many keys
|
|
#
|
|
|
|
my @fields=(); my @keys=();
|
|
$keys=min($limits->{'max_index'},16); # 16 is more than enough
|
|
$seg= min($limits->{'max_index_parts'},$keys,16); # 16 is more than enough
|
|
|
|
# Make keys on the most important types
|
|
@types=(0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1); # A 1 for each char field
|
|
push(@fields,"field1 tinyint not null");
|
|
push(@fields,"field2 mediumint not null");
|
|
push(@fields,"field3 smallint not null");
|
|
push(@fields,"field4 char(16) not null");
|
|
push(@fields,"field5 integer not null");
|
|
push(@fields,"field6 float not null");
|
|
push(@fields,"field7 double not null");
|
|
for ($i=8 ; $i <= $keys ; $i++)
|
|
{
|
|
push(@fields,"field$i char(5) not null"); # Should be relatively fair
|
|
}
|
|
|
|
# Let first key contain many segments
|
|
my $query="primary key (";
|
|
for ($i= 1 ; $i <= $seg ; $i++)
|
|
{
|
|
$query.= "field$i,";
|
|
}
|
|
substr($query,-1)=")";
|
|
push (@keys,$query);
|
|
|
|
#Create other keys
|
|
for ($i=2 ; $i <= $keys ; $i++)
|
|
{
|
|
push(@keys,"index index$i (field$i)");
|
|
}
|
|
|
|
$loop_time=new Benchmark;
|
|
for ($i=1 ; $i <= $create_loop_count ; $i++)
|
|
{
|
|
do_many($dbh,$server->create("bench_$i", \@fields, \@keys));
|
|
$dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;
|
|
}
|
|
|
|
$end_time=new Benchmark;
|
|
print "Time for create_key+drop ($opt_loop_count): " .
|
|
timestr(timediff($end_time, $loop_time),"all") . "\n";
|
|
|
|
if ($opt_fast && defined($server->{vacuum}))
|
|
{
|
|
$server->vacuum(1,\$dbh);
|
|
}
|
|
|
|
####
|
|
#### End of benchmark
|
|
####
|
|
|
|
$dbh->disconnect; # close connection
|
|
end_benchmark($start_time);
|