236 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			236 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								#!/usr/bin/perl
							 | 
						||
| 
								 | 
							
								# Copyright (c) 2000, 2001, 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
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Test of alter table
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								##################### Standard benchmark inits ##############################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Cwd;
							 | 
						||
| 
								 | 
							
								use DBI;
							 | 
						||
| 
								 | 
							
								use Benchmark;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$opt_start_field_count=8;	# start with this many fields
							 | 
						||
| 
								 | 
							
								$opt_loop_count=100;		# How many tests to do
							 | 
						||
| 
								 | 
							
								$opt_row_count=1000; 		# Rows in the table
							 | 
						||
| 
								 | 
							
								$opt_field_count=1000;		# Add until this many fields.
							 | 
						||
| 
								 | 
							
								$opt_time_limit=10*60;		# Don't wait more than 10 min for some tests
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$pwd = cwd(); $pwd = "." if ($pwd eq '');
							 | 
						||
| 
								 | 
							
								require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$opt_field_count=min($opt_field_count,$limits->{'max_columns'},
							 | 
						||
| 
								 | 
							
										     ($limits->{'query_size'}-30)/14);
							 | 
						||
| 
								 | 
							
								$opt_start_field_count=min($opt_start_field_count,$limits->{'max_index'});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($opt_small_test)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $opt_row_count/=10;
							 | 
						||
| 
								 | 
							
								  $opt_field_count/=10;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (!$limits->{'alter_table'})
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print("Some of the servers given with --cmp or --server doesn't support ALTER TABLE\nTest aborted\n\n");
							 | 
						||
| 
								 | 
							
								  $start_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								  end_benchmark($start_time);
							 | 
						||
| 
								 | 
							
								  exit 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								print "Testing of ALTER TABLE\n";
							 | 
						||
| 
								 | 
							
								print "Testing with $opt_field_count columns and $opt_row_count rows in $opt_loop_count steps\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								#### Create a table and fill it with data
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$dbh = $server->connect();
							 | 
						||
| 
								 | 
							
								@fields=();
							 | 
						||
| 
								 | 
							
								@index=();
							 | 
						||
| 
								 | 
							
								push(@fields,"i1 int not null");
							 | 
						||
| 
								 | 
							
								for ($i=2 ; $i <= $opt_start_field_count ; $i++)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  push(@fields,"i${i} int not null");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								$field_count= $opt_start_field_count;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$start_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$dbh->do("drop table bench" . $server->{'drop_attr'});
							 | 
						||
| 
								 | 
							
								do_many($dbh,$server->create("bench",\@fields,\@index));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								print "Insert data into the table\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$loop_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($opt_fast && $server->{transactions})
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $dbh->{AutoCommit} = 0;
							 | 
						||
| 
								 | 
							
								  print "Transactions enabled\n" if ($opt_debug);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for ($i=0 ; $i < $opt_row_count ; $i++)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $query="insert into bench values ( " . ("$i," x ($opt_start_field_count-1)) . "$i)";
							 | 
						||
| 
								 | 
							
								  $dbh->do($query) or die $DBI::errstr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($opt_fast && $server->{transactions})
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $dbh->commit;
							 | 
						||
| 
								 | 
							
								  $dbh->{AutoCommit} = 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								print "Time for insert ($opt_row_count)",
							 | 
						||
| 
								 | 
							
								  timestr(timediff($end_time, $loop_time),"all") . "\n\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								#### Add fields to the table.
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$loop_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								$add= int(($opt_field_count-$opt_start_field_count)/$opt_loop_count)+1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$multi_add=$server->{'limits'}->{'alter_add_multi_col'} == 1;
							 | 
						||
| 
								 | 
							
								if ($opt_fast)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $add=1 if (!$server->{'limits'}->{'alter_add_multi_col'});
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $add=1 if (!$limits->{'alter_add_multi_col'});
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$count=0;
							 | 
						||
| 
								 | 
							
								while ($field_count < $opt_field_count)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $count++;
							 | 
						||
| 
								 | 
							
								  $end=min($field_count+$add,$opt_field_count);
							 | 
						||
| 
								 | 
							
								  $fields="";
							 | 
						||
| 
								 | 
							
								  $tmp="ADD ";
							 | 
						||
| 
								 | 
							
								  while ($field_count < $end)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    $field_count++;
							 | 
						||
| 
								 | 
							
								    $fields.=",$tmp i${field_count} integer";
							 | 
						||
| 
								 | 
							
								    $tmp="" if (!$multi_add);			# Adabas
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  do_query($dbh,"ALTER TABLE bench " . substr($fields,1));
							 | 
						||
| 
								 | 
							
								  $end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								  last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$count,
							 | 
						||
| 
								 | 
							
													 $opt_field_count/$add+1));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								if ($estimated)
							 | 
						||
| 
								 | 
							
								{ print "Estimated time"; }
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								{ print "Time"; }
							 | 
						||
| 
								 | 
							
								print " for alter_table_add ($count): " .
							 | 
						||
| 
								 | 
							
								  timestr(timediff($end_time, $loop_time),"all") . "\n\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# If estimated, fix table to have known number of fields
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								if ($estimated && $field_count < $opt_field_count)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $fields="";
							 | 
						||
| 
								 | 
							
								  $tmp="ADD ";
							 | 
						||
| 
								 | 
							
								  while ($field_count < $opt_field_count)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    $field_count++;
							 | 
						||
| 
								 | 
							
								    $fields.=",$tmp i${field_count} integer";
							 | 
						||
| 
								 | 
							
								    $tmp="" if (!$multi_add);			# Adabas
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  do_query($dbh,"ALTER TABLE bench " . substr($fields,1));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								#### Test adding and deleting index on the first $opt_start_fields
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$loop_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$count= 0;
							 | 
						||
| 
								 | 
							
								for ($i=1; $i <= $opt_start_field_count ; $i++)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $dbh->do("CREATE INDEX bench_ind$i ON bench (i${i})") || die $DBI::errstr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								print "Time for create_index ($opt_start_field_count): " .
							 | 
						||
| 
								 | 
							
								  timestr(timediff($end_time, $loop_time),"all") . "\n\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$loop_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								for ($i=1; $i <= $opt_start_field_count ; $i++)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $dbh->do($server->drop_index("bench","bench_ind$i")) || die $DBI::errstr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								print "Time for drop_index ($opt_start_field_count): " .
							 | 
						||
| 
								 | 
							
								  timestr(timediff($end_time, $loop_time),"all") . "\n\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								#### Delete fields from the table
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								goto skip_dropcol if (!$limits->{'alter_table_dropcol'});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$loop_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$count=0;
							 | 
						||
| 
								 | 
							
								while ($field_count > $opt_start_field_count)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $count++;
							 | 
						||
| 
								 | 
							
								  $end=max($field_count-$add,$opt_start_field_count);
							 | 
						||
| 
								 | 
							
								  $fields="";
							 | 
						||
| 
								 | 
							
								  while(--$field_count >= $end)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    $fields.=",DROP i${field_count}";
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  $dbh->do("ALTER TABLE bench " . substr($fields,1) . $server->{'drop_attr'})
							 | 
						||
| 
								 | 
							
								  || die $DBI::errstr;
							 | 
						||
| 
								 | 
							
								  $end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								  last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$count,
							 | 
						||
| 
								 | 
							
													 $opt_field_count/$add+1));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$end_time=new Benchmark;
							 | 
						||
| 
								 | 
							
								if ($estimated)
							 | 
						||
| 
								 | 
							
								{ print "Estimated time"; }
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								{ print "Time"; }
							 | 
						||
| 
								 | 
							
								print " for alter_table_drop ($count): " .
							 | 
						||
| 
								 | 
							
								  timestr(timediff($end_time, $loop_time),"all") . "\n\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								skip_dropcol:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################################ END ###################################
							 | 
						||
| 
								 | 
							
								####
							 | 
						||
| 
								 | 
							
								#### End of the test...Finally print time used to execute the
							 | 
						||
| 
								 | 
							
								#### whole test.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$dbh->do("drop table bench" . $server->{'drop_attr'});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$dbh->disconnect;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								end_benchmark($start_time);
							 |