~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to tests/sql-bench/test-create

  • Committer: patrick crews
  • Date: 2011-06-07 18:45:15 UTC
  • mto: This revision was merged to the branch mainline in revision 2329.
  • Revision ID: gleebix@gmail.com-20110607184515-vwzakr741grhr2yl
Initial work for sql-bench mode.  Added sql-bench to the tree.  Test script for running entire suite added

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl
 
2
# Copyright (C) 2000-2003 MySQL AB
 
3
#
 
4
# This library is free software; you can redistribute it and/or
 
5
# modify it under the terms of the GNU Library General Public
 
6
# License as published by the Free Software Foundation; version 2
 
7
# of the License.
 
8
#
 
9
# This library is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
# Library General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU Library General Public
 
15
# License along with this library; if not, write to the Free
 
16
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 
17
# MA 02111-1307, USA
 
18
#
 
19
# This test is for testing how long it takes to create tables,
 
20
# make a count(*) from them and finally drop the tables. These
 
21
# commands will be done in different ways in this test.
 
22
# Using option --fast will drop all the tables in the end
 
23
# of this test with one command instead of making own
 
24
# 'drop' command for each and every table.
 
25
# By changing the variable '$table_amount' value you can make
 
26
# this test a lot harder/easier for your computer to drive.
 
27
# Note that when using value bigger than 64 for this variable
 
28
# will do 'drop table'-command  in totally different way because of that
 
29
# how MySQL handles these commands.
 
30
 
 
31
##################### Standard benchmark inits ##############################
 
32
 
 
33
use Cwd;
 
34
use DBI;
 
35
use Benchmark;
 
36
 
 
37
$opt_loop_count=10000; # Change this to make test harder/easier
 
38
# This is the default value for the amount of tables used in this test.
 
39
 
 
40
$pwd = cwd(); $pwd = "." if ($pwd eq '');
 
41
require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n";
 
42
 
 
43
$create_loop_count=$opt_loop_count;
 
44
if ($opt_small_test)
 
45
{
 
46
  $opt_loop_count/=100;
 
47
  $create_loop_count/=1000;
 
48
}
 
49
 
 
50
$max_tables=min($limits->{'max_tables'},$opt_loop_count);
 
51
 
 
52
if ($opt_small_test)
 
53
{
 
54
  $max_tables=10;
 
55
}
 
56
 
 
57
 
 
58
print "Testing the speed of creating and dropping tables\n";
 
59
print "Testing with $max_tables tables and $opt_loop_count loop count\n\n";
 
60
 
 
61
####
 
62
####  Connect and start timeing
 
63
####
 
64
 
 
65
$dbh = $server->connect();
 
66
 
 
67
### Test how the database can handle many tables
 
68
### Create $max_tables ; Access all off them with a simple query
 
69
### and then drop the tables
 
70
 
 
71
if ($opt_force) # If tables used in this test exist, drop 'em
 
72
{
 
73
  print "Okay..Let's make sure that our tables don't exist yet.\n\n";
 
74
  for ($i=1 ; $i <= $max_tables ; $i++)
 
75
  {
 
76
    $dbh->do("drop table bench_$i" . $server->{'drop_attr'});
 
77
  }
 
78
}
 
79
 
 
80
if ($opt_fast && defined($server->{vacuum}))
 
81
{
 
82
  $server->vacuum(1,\$dbh);
 
83
}
 
84
 
 
85
print "Testing create of tables\n";
 
86
 
 
87
$loop_time=$start_time=new Benchmark;
 
88
 
 
89
for ($i=1 ; $i <= $max_tables ; $i++)
 
90
{
 
91
    $dbh->do("drop table if exists bench_$i");
 
92
    if (do_many($dbh,$server->create("bench_$i",
 
93
                                   ["i int NOT NULL",
 
94
                                    "d double",
 
95
                                    "f float",
 
96
                                    "s char(10)",
 
97
                                    "v varchar(100)"],
 
98
                                   ["primary key (i)"])))
 
99
  {
 
100
    # Got an error; Do cleanup
 
101
    for ($i=1 ; $i <= $max_tables ; $i++)
 
102
    {
 
103
      $dbh->do("drop table bench_$i" . $server->{'drop_attr'});
 
104
    }
 
105
    die "Test aborted";
 
106
  }
 
107
}
 
108
 
 
109
$end_time=new Benchmark;
 
110
print "Time for create_MANY_tables ($max_tables): " .
 
111
  timestr(timediff($end_time, $loop_time),"all") . "\n\n";
 
112
 
 
113
if ($opt_fast && defined($server->{vacuum}))
 
114
{
 
115
  $server->vacuum(1,\$dbh);
 
116
}
 
117
 
 
118
#### Here comes $max_tables couples of cont(*) to the tables.
 
119
#### We'll check how long it will take...
 
120
####
 
121
 
 
122
print "Accessing tables\n";
 
123
 
 
124
if ($limits->{'group_functions'})
 
125
{
 
126
  $query="select count(*) from ";
 
127
  $type="select_group_when_MANY_tables";
 
128
}
 
129
else
 
130
{
 
131
  $query="select * from ";
 
132
  $type="select_when_MANY_tables";
 
133
}
 
134
 
 
135
$loop_time=new Benchmark;
 
136
for ($i=1 ; $i <= $max_tables ; $i++)
 
137
{
 
138
  $sth = $dbh->do("$query bench_$i") or die $DBI::errstr;
 
139
}
 
140
 
 
141
$end_time=new Benchmark;
 
142
print "Time to $type ($max_tables): " .
 
143
    timestr(timediff($end_time, $loop_time),"all") . "\n\n";
 
144
 
 
145
####
 
146
#### Now we are going to drop $max_tables tables;
 
147
####
 
148
 
 
149
print "Testing drop\n";
 
150
 
 
151
$loop_time=new Benchmark;
 
152
 
 
153
if ($opt_fast && $server->{'limits'}->{'multi_drop'} &&
 
154
    $server->{'limits'}->{'query_size'} > 11+$max_tables*10)
 
155
{
 
156
  my $query="drop table bench_1";
 
157
  for ($i=2 ; $i <= $max_tables ; $i++)
 
158
  {
 
159
    $query.=",bench_$i";
 
160
  }
 
161
  $sth = $dbh->do($query . $server->{'drop_attr'}) or die $DBI::errstr;
 
162
}
 
163
else
 
164
{
 
165
  for ($i=1 ; $i <= $max_tables ; $i++)
 
166
  {
 
167
    $sth = $dbh->do("drop table bench_$i" . $server->{'drop_attr'})
 
168
      or die $DBI::errstr;
 
169
  }
 
170
}
 
171
 
 
172
 
 
173
$end_time=new Benchmark;
 
174
print "Time for drop_table_when_MANY_tables ($max_tables): " .
 
175
    timestr(timediff($end_time, $loop_time),"all") . "\n\n";
 
176
 
 
177
if ($opt_fast && defined($server->{vacuum}))
 
178
{
 
179
  $server->vacuum(1,\$dbh);
 
180
}
 
181
 
 
182
#### We'll do first one 'create table' and then we'll drop it
 
183
#### away immediately. This loop shall be executed $opt_loop_count
 
184
#### times.
 
185
 
 
186
print "Testing create+drop\n";
 
187
 
 
188
$loop_time=new Benchmark;
 
189
 
 
190
for ($i=1 ; $i <= $create_loop_count ; $i++)
 
191
{
 
192
    $dbh->do("drop table if exists bench_$i");
 
193
    do_many($dbh,$server->create("bench_$i",
 
194
                               ["i int NOT NULL",
 
195
                                "d double",
 
196
                                "f float",
 
197
                                "s char(10)",
 
198
                                "v varchar(100)"],
 
199
                               ["primary key (i)"]));
 
200
  $sth = $dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;
 
201
}
 
202
 
 
203
$end_time=new Benchmark;
 
204
print "Time for create+drop ($create_loop_count): " .
 
205
    timestr(timediff($end_time, $loop_time),"all") . "\n";
 
206
 
 
207
if ($opt_fast && defined($server->{vacuum}))
 
208
{
 
209
  $server->vacuum(1,\$dbh);
 
210
}
 
211
 
 
212
#
 
213
# Same test, but with a table with many keys
 
214
#
 
215
 
 
216
my @fields=(); my @keys=();
 
217
$keys=min($limits->{'max_index'},16);           # 16 is more than enough
 
218
$seg= min($limits->{'max_index_parts'},$keys,16);       # 16 is more than enough
 
219
 
 
220
# Make keys on the most important types
 
221
@types=(0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1);     # A 1 for each char field
 
222
push(@fields,"field1 integer not null");
 
223
push(@fields,"field2 integer not null");
 
224
push(@fields,"field3 integer not null");
 
225
push(@fields,"field4 char(16) not null");
 
226
push(@fields,"field5 integer not null");
 
227
push(@fields,"field6 float not null");
 
228
push(@fields,"field7 double not null");
 
229
for ($i=8 ; $i <= $keys ; $i++)
 
230
{
 
231
  push(@fields,"field$i char(5) not null");     # Should be relatively fair
 
232
}
 
233
 
 
234
# Let first key contain many segments
 
235
my $query="primary key (";
 
236
for ($i= 1 ; $i <= $seg ; $i++)
 
237
{
 
238
  $query.= "field$i,";
 
239
}
 
240
substr($query,-1)=")";
 
241
push (@keys,$query);
 
242
 
 
243
#Create other keys
 
244
for ($i=2 ; $i <= $keys ; $i++)
 
245
{
 
246
  push(@keys,"index index$i (field$i)");
 
247
}
 
248
 
 
249
$loop_time=new Benchmark;
 
250
for ($i=1 ; $i <= $opt_loop_count ; $i++) {
 
251
    $dbh->do("drop table if exists bench_$i");
 
252
    do_many($dbh,$server->create("bench_$i", \@fields, \@index));
 
253
    $dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;
 
254
}
 
255
 
 
256
$end_time=new Benchmark;
 
257
print "Time for create_key+drop ($opt_loop_count): " .
 
258
    timestr(timediff($end_time, $loop_time),"all") . "\n";
 
259
 
 
260
if ($opt_fast && defined($server->{vacuum}))
 
261
{
 
262
  $server->vacuum(1,\$dbh);
 
263
}
 
264
 
 
265
####
 
266
#### End of benchmark
 
267
####
 
268
 
 
269
$dbh->disconnect;                               # close connection
 
270
end_benchmark($start_time);