270 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			270 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								#!/usr/bin/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-1301, 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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$max_tables=min($limits->{'max_tables'},$opt_loop_count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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_tables ; $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 <= $opt_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);
							 |