test-create.sh
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!@PERL@
  2. # Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult 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; either
  7. # version 2 of the License, or (at your option) any later version.
  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. ##################### Standard benchmark inits ##############################
  31. use DBI;
  32. use Benchmark;
  33. $opt_loop_count=10000; # Change this to make test harder/easier
  34. # This is the default value for the amount of tables used in this test.
  35. chomp($pwd = `pwd`); $pwd = "." if ($pwd eq '');
  36. require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!n";
  37. if ($opt_small_test)
  38. {
  39.   $opt_loop_count/=100;
  40. }
  41. $max_tables=min($limits->{'max_tables'},$opt_loop_count);
  42. print "Testing the speed of creating and droping tablesn";
  43. print "Testing with $max_tables tables and $opt_loop_count loop countnn";
  44. ####
  45. ####  Connect and start timeing
  46. ####
  47. $dbh = $server->connect();
  48. ### Test how the database can handle many tables
  49. ### Create $max_tables ; Access all off them with a simple query
  50. ### and then drop the tables
  51. if ($opt_force) # If tables used in this test exist, drop 'em
  52. {
  53.   print "Okay..Let's make sure that our tables don't exist yet.nn";
  54.   for ($i=1 ; $i <= $max_tables ; $i++)
  55.   {
  56.     $dbh->do("drop table bench_$i" . $server->{'drop_attr'});
  57.   }
  58. }
  59. if ($opt_fast && defined($server->{vacuum}))
  60. {
  61.   $server->vacuum(1,$dbh);
  62. }
  63. print "Testing create of tablesn";
  64. $loop_time=$start_time=new Benchmark;
  65. for ($i=1 ; $i <= $max_tables ; $i++)
  66. {
  67.   if (do_many($dbh,$server->create("bench_$i",
  68.    ["i int NOT NULL",
  69.     "d double",
  70.     "f float",
  71.     "s char(10)",
  72.     "v varchar(100)"],
  73.    ["primary key (i)"])))
  74.   {
  75.     # Got an error; Do cleanup
  76.     for ($i=1 ; $i <= $max_tables ; $i++)
  77.     {
  78.       $dbh->do("drop table bench_$i" . $server->{'drop_attr'});
  79.     }
  80.     die "Test aborted";
  81.   }
  82. }
  83. $end_time=new Benchmark;
  84. print "Time for create_MANY_tables ($max_tables): " .
  85.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  86. if ($opt_fast && defined($server->{vacuum}))
  87. {
  88.   $server->vacuum(1,$dbh);
  89. }
  90. #### Here comes $max_tables couples of cont(*) to the tables.
  91. #### We'll check how long it will take...
  92. ####
  93. print "Accessing tablesn";
  94. if ($limits->{'group_functions'})
  95. {
  96.   $query="select count(*) from ";
  97.   $type="select_group_when_MANY_tables";
  98. }
  99. else
  100. {
  101.   $query="select * from ";
  102.   $type="select_when_MANY_tables";
  103. }
  104. $loop_time=new Benchmark;
  105. for ($i=1 ; $i <= $max_tables ; $i++)
  106. {
  107.   $sth = $dbh->do("$query bench_$i") or die $DBI::errstr;
  108. }
  109. $end_time=new Benchmark;
  110. print "Time to $type ($max_tables): " .
  111.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  112. ####
  113. #### Now we are going to drop $max_tables tables;
  114. ####
  115. print "Testing dropn";
  116. $loop_time=new Benchmark;
  117. if ($opt_fast && $server->{'limits'}->{'multi_drop'} &&
  118.     $server->{'limits'}->{'query_size'} > 11+$max_tables*10)
  119. {
  120.   my $query="drop table bench_1";
  121.   for ($i=2 ; $i <= $max_tables ; $i++)
  122.   {
  123.     $query.=",bench_$i";
  124.   }
  125.   $sth = $dbh->do($query . $server->{'drop_attr'}) or die $DBI::errstr;
  126. }
  127. else
  128. {
  129.   for ($i=1 ; $i <= $max_tables ; $i++)
  130.   {
  131.     $sth = $dbh->do("drop table bench_$i" . $server->{'drop_attr'})
  132.       or die $DBI::errstr;
  133.   }
  134. }
  135. $end_time=new Benchmark;
  136. print "Time for drop_table_when_MANY_tables ($max_tables): " .
  137.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  138. if ($opt_fast && defined($server->{vacuum}))
  139. {
  140.   $server->vacuum(1,$dbh);
  141. }
  142. #### We'll do first one 'create table' and then we'll drop it
  143. #### away immediately. This loop shall be executed $opt_loop_count
  144. #### times.
  145. print "Testing create+dropn";
  146. $loop_time=new Benchmark;
  147. for ($i=1 ; $i <= $opt_loop_count ; $i++)
  148. {
  149.   do_many($dbh,$server->create("bench_$i",
  150.        ["i int NOT NULL",
  151. "d double",
  152. "f float",
  153. "s char(10)",
  154. "v varchar(100)"],
  155.        ["primary key (i)"]));
  156.   $sth = $dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;
  157. }
  158. $end_time=new Benchmark;
  159. print "Time for create+drop ($opt_loop_count): " .
  160.     timestr(timediff($end_time, $loop_time),"all") . "n";
  161. if ($opt_fast && defined($server->{vacuum}))
  162. {
  163.   $server->vacuum(1,$dbh);
  164. }
  165. #
  166. # Same test, but with a table with many keys
  167. #
  168. my @fields=(); my @keys=();
  169. $keys=min($limits->{'max_index'},16); # 16 is more than enough
  170. $seg= min($limits->{'max_index_parts'},$keys,16); # 16 is more than enough
  171. # Make keys on the most important types
  172. @types=(0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1); # A 1 for each char field
  173. push(@fields,"field1 tinyint not null");
  174. push(@fields,"field2 mediumint not null");
  175. push(@fields,"field3 smallint not null");
  176. push(@fields,"field4 char(16) not null");
  177. push(@fields,"field5 integer not null");
  178. push(@fields,"field6 float not null");
  179. push(@fields,"field7 double not null");
  180. for ($i=8 ; $i <= $keys ; $i++)
  181. {
  182.   push(@fields,"field$i char(5) not null"); # Should be relatively fair
  183. }
  184. # Let first key contain many segments
  185. my $query="primary key (";
  186. for ($i= 1 ; $i <= $seg ; $i++)
  187. {
  188.   $query.= "field$i,";
  189. }
  190. substr($query,-1)=")";
  191. push (@keys,$query);
  192. #Create other keys
  193. for ($i=2 ; $i <= $keys ; $i++)
  194. {
  195.   push(@keys,"index index$i (field$i)");
  196. }
  197. $loop_time=new Benchmark;
  198. for ($i=1 ; $i <= $opt_loop_count ; $i++)
  199. {
  200.   do_many($dbh,$server->create("bench_$i", @fields, @index));
  201.   $dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;
  202. }
  203. $end_time=new Benchmark;
  204. print "Time for create_key+drop ($opt_loop_count): " .
  205.     timestr(timediff($end_time, $loop_time),"all") . "n";
  206. if ($opt_fast && defined($server->{vacuum}))
  207. {
  208.   $server->vacuum(1,$dbh);
  209. }
  210. ####
  211. #### End of benchmark
  212. ####
  213. $dbh->disconnect; # close connection
  214. end_benchmark($start_time);