test-create
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

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