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