test-select
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:14k
源码类别:

MySQL数据库

开发平台:

Visual 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. # Test of selecting on keys that consist of many parts
  20. #
  21. ##################### Standard benchmark inits ##############################
  22. use Cwd;
  23. use DBI;
  24. use Getopt::Long;
  25. use Benchmark;
  26. $opt_loop_count=10000;
  27. $opt_medium_loop_count=1000;
  28. $opt_small_loop_count=10;
  29. $opt_regions=6;
  30. $opt_groups=100;
  31. $pwd = cwd(); $pwd = "." if ($pwd eq '');
  32. require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!n";
  33. $columns=min($limits->{'max_columns'},500,($limits->{'query_size'}-50)/24,
  34.      $limits->{'max_conditions'}/2-3);
  35. if ($opt_small_test)
  36. {
  37.   $opt_loop_count/=10;
  38.   $opt_medium_loop_count/=10;
  39.   $opt_small_loop_count/=10;
  40.   $opt_groups/=10;
  41. }
  42. print "Testing the speed of selecting on keys that consist of many partsn";
  43. print "The test-table has $opt_loop_count rows and the test is done with $columns ranges.nn";
  44. ####
  45. ####  Connect and start timeing
  46. ####
  47. $dbh = $server->connect();
  48. $start_time=new Benchmark;
  49. ####
  50. #### Create needed tables
  51. ####
  52. goto select_test if ($opt_skip_create);
  53. print "Creating tablen";
  54. $dbh->do("drop table bench1" . $server->{'drop_attr'});
  55. do_many($dbh,$server->create("bench1",
  56.      ["region char(1) NOT NULL",
  57.       "idn integer(6) NOT NULL",
  58.       "rev_idn integer(6) NOT NULL",
  59.       "grp integer(6) NOT NULL"],
  60.      ["primary key (region,idn)",
  61.       "unique (region,rev_idn)",
  62.       "unique (region,grp,idn)"]));
  63. if ($opt_lock_tables)
  64. {
  65.   do_query($dbh,"LOCK TABLES bench1 WRITE");
  66. }
  67. if ($opt_fast && defined($server->{vacuum}))
  68. {
  69.   $server->vacuum(1,$dbh);
  70. }
  71. ####
  72. #### Insert $opt_loop_count records with
  73. #### region: "A" -> "E"
  74. #### idn:  0 -> count
  75. #### rev_idn: count -> 0,
  76. #### grp: distributed values 0 - > count/100
  77. ####
  78. print "Inserting $opt_loop_count rowsn";
  79. $loop_time=new Benchmark;
  80. if ($opt_fast && $server->{transactions})
  81. {
  82.   $dbh->{AutoCommit} = 0;
  83. }
  84. $query="insert into bench1 values (";
  85. $half_done=$opt_loop_count/2;
  86. for ($id=0,$rev_id=$opt_loop_count-1 ; $id < $opt_loop_count ; $id++,$rev_id--)
  87. {
  88.   $grp=$id*3 % $opt_groups;
  89.   $region=chr(65+$id%$opt_regions);
  90.   do_query($dbh,"$query'$region',$id,$rev_id,$grp)");
  91.   if ($id == $half_done)
  92.   { # Test with different insert
  93.     $query="insert into bench1 (region,idn,rev_idn,grp) values (";
  94.   }
  95. }
  96. if ($opt_fast && $server->{transactions})
  97. {
  98.   $dbh->commit;
  99.   $dbh->{AutoCommit} = 1;
  100. }
  101. $end_time=new Benchmark;
  102. print "Time to insert ($opt_loop_count): " .
  103.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  104. if ($opt_lock_tables)
  105. {
  106.   do_query($dbh,"UNLOCK TABLES");
  107. }
  108. if ($opt_fast && defined($server->{vacuum}))
  109. {
  110.   $server->vacuum(0,$dbh,"bench1");
  111. }
  112. if ($opt_lock_tables)
  113. {
  114.   do_query($dbh,"LOCK TABLES bench1 WRITE");
  115. }
  116. ####
  117. #### Do some selects on the table
  118. ####
  119. select_test:
  120. if ($limits->{'group_functions'})
  121. {
  122.   my ($tmp); $tmp=1000;
  123.   print "Test if the database has a query cachen";
  124.   # First ensure that the table is read into memory
  125.   fetch_all_rows($dbh,"select sum(idn+$tmp),sum(rev_idn-$tmp) from bench1");
  126.   $loop_time=new Benchmark;
  127.   for ($tests=0 ; $tests < $opt_loop_count ; $tests++)
  128.   {
  129.     fetch_all_rows($dbh,"select sum(idn+100),sum(rev_idn-100) from bench1");
  130.   }
  131.   $end_time=new Benchmark;
  132.   print "Time for select_cache ($opt_loop_count): " .
  133.      timestr(timediff($end_time, $loop_time),"all") . "nn";
  134.   # If the database has a query cache, the following loop should be much
  135.   # slower than the previous loop
  136.   $loop_time=new Benchmark;
  137.   for ($tests=0 ; $tests < $opt_loop_count ; $tests++)
  138.   {
  139.     fetch_all_rows($dbh,"select sum(idn+$tests),sum(rev_idn-$tests) from bench1");
  140.   }
  141.   $end_time=new Benchmark;
  142.   print "Time for select_cache2 ($opt_loop_count): " .
  143.      timestr(timediff($end_time, $loop_time),"all") . "nn";
  144. }
  145. print "Testing big selects on the tablen";
  146. $loop_time=new Benchmark;
  147. $rows=0;
  148. for ($i=0 ; $i < $opt_small_loop_count ; $i++)
  149. {
  150.   $grp=$i*11 % $opt_groups;
  151.   $region=chr(65+$i%($opt_regions+1)); # One larger to test misses
  152.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where region='$region'");
  153.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where region='$region' and idn=$i");
  154.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where region='$region' and rev_idn=$i");
  155.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where region='$region' and grp=$grp");
  156.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where region>='B' and region<='C' and grp=$grp");
  157.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where region>='B' and region<='E' and grp=$grp");
  158.   $rows+=fetch_all_rows($dbh,"select idn from bench1 where grp=$grp"); # This is hard
  159. }
  160. $count=$opt_small_loop_count*7;
  161. $end_time=new Benchmark;
  162. print "Time for select_big ($count:$rows): " .
  163.     timestr(timediff($end_time, $loop_time),"all") . "n";
  164. # Test select with many OR's
  165. $loop_time=new Benchmark;
  166. $tmpvar=0;
  167. $count=0;
  168. $estimated=0;
  169. $max_and_conditions=$limits->{'max_conditions'}/2;
  170. $rows=0;
  171. for ($i=0 ; $i < $opt_small_loop_count ; $i++)
  172. {
  173.   $region=chr(65+$i%($opt_regions+1)); # One larger to test out-of-regions
  174.   $query="select * from bench1 where ";
  175.   $or_part="grp = 1";
  176.   $or_part2="region='A' and grp=1";
  177.   for ($j=1 ; $j < $columns; $j++)
  178.   {
  179.     $tmpvar^= ((($tmpvar + 63) + $j)*3 % 100000);
  180.     $tmp=$tmpvar % $opt_groups;
  181.     $tmp_region=chr(65+$tmpvar%$opt_regions);
  182.     $or_part.=" or grp=$tmp";
  183.     if ($j < $max_and_conditions)
  184.     {
  185.       $or_part2.=" or region='$tmp_region' and grp=$tmp";
  186.     }
  187.   }
  188.   $or_part="region='$region' and ($or_part)";
  189. # Same query, but use 'func_extra_in_num' instead.
  190.   if ($limits->{'func_extra_in_num'})
  191.   {
  192.     $in_part=$or_part;
  193.     $in_part=~ s/ = / IN (/;
  194.     $in_part=~ s/ or grp=/,/g;
  195.     $in_part.= ")";
  196.     defined($found=fetch_all_rows($dbh,$query . $in_part)) || die $DBI::errstr;
  197.     $rows+=$found;
  198.     $count++;
  199.   }
  200.   for ($j=0; $j < 10 ; $j++)
  201.   {
  202.     $rows+=fetch_all_rows($dbh,$query . $or_part);
  203.     $rows+=fetch_all_rows($dbh,$query . $or_part2);
  204. # Do it a little harder by setting a extra range
  205.     $rows+=fetch_all_rows($dbh,"$query ($or_part) and idn < 50");
  206.     $rows+=fetch_all_rows($dbh,"$query (($or_part) or (region='A' and grp < 10)) and region <='B'")
  207.   }
  208.   $count+=$j*4;
  209.   $end_time=new Benchmark;
  210.   last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  211.  $opt_small_loop_count));
  212. }
  213. print_time($estimated);
  214. print " for select_range ($count:$rows): " .
  215.   timestr(timediff($end_time, $loop_time),"all") . "n";
  216. #
  217. # Testing MIN() and MAX() on keys
  218. #
  219. if ($limits->{'group_functions'} && $limits->{'order_by_unused'})
  220. {
  221.   $loop_time=new Benchmark;
  222.   $count=0;
  223.   $estimated=0;
  224.   for ($tests=0 ; $tests < $opt_loop_count ; $tests++)
  225.   {
  226.     $count+=7;
  227.     $grp=$tests*3 % $opt_groups;
  228.     $region=chr(65+$tests % $opt_regions);
  229.     if ($limits->{'group_func_sql_min_str'})
  230.     {
  231.       fetch_all_rows($dbh,"select min(region) from bench1");
  232.       fetch_all_rows($dbh,"select max(region) from bench1");
  233.       fetch_all_rows($dbh,"select min(region),max(region) from bench1");
  234.     }
  235.     fetch_all_rows($dbh,"select min(rev_idn) from bench1 where region='$region'");
  236.     fetch_all_rows($dbh,"select max(grp) from bench1 where region='$region'");
  237.     fetch_all_rows($dbh,"select max(idn) from bench1 where region='$region' and grp=$grp");
  238.     if ($limits->{'group_func_sql_min_str'})
  239.     {
  240.       fetch_all_rows($dbh,"select max(region) from bench1 where region<'$region'");
  241.     }
  242.     $end_time=new Benchmark;
  243.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,
  244.    $tests+1, $opt_loop_count));
  245.   }
  246.   print_time($estimated);
  247.   print " for min_max_on_key ($count): " .
  248.     timestr(timediff($end_time, $loop_time),"all") . "n";
  249.   $loop_time=new Benchmark;
  250.   $count=0;
  251.   $estimated=0;
  252.   for ($tests=0 ; $tests < $opt_loop_count ; $tests++)
  253.   {
  254.     $count+=5;
  255.     $grp=$tests*3 % $opt_groups;
  256.     $region=chr(65+$tests % $opt_regions);
  257.     fetch_all_rows($dbh,"select count(*) from bench1 where region='$region'");
  258.     fetch_all_rows($dbh,"select count(*) from bench1 where region='$region' and grp=$grp");
  259.     fetch_all_rows($dbh,"select count(*) from bench1 where region>'$region'");
  260.     fetch_all_rows($dbh,"select count(*) from bench1 where region<='$region'");
  261.     fetch_all_rows($dbh,"select count(*) from bench1 where region='$region' and grp>$grp");
  262.     $end_time=new Benchmark;
  263.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,
  264.    $tests+1, $opt_loop_count));
  265.   }
  266.   print_time($estimated);
  267.   print " for count_on_key ($count): " .
  268.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  269.   
  270. }
  271. if ($limits->{'group_functions'})
  272. {
  273.   $loop_time=new Benchmark;
  274.   $rows=0;
  275.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  276.   {
  277.     $rows+=fetch_all_rows($dbh,"select grp,count(*) from bench1 group by grp");
  278.   }
  279.   $end_time=new Benchmark;
  280.   print "Time for count_group_on_key_parts ($i:$rows): " .
  281.     timestr(timediff($end_time, $loop_time),"all") . "n";
  282. }
  283. if ($limits->{'group_distinct_functions'})
  284. {
  285.   print "Testing count(distinct) on the tablen";
  286.   $loop_time=new Benchmark;
  287.   $rows=$estimated=$count=0;
  288.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  289.   {
  290.     $count++;
  291.     $rows+=fetch_all_rows($dbh,"select count(distinct region) from bench1");
  292.     $end_time=new Benchmark;
  293.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  294.    $opt_medium_loop_count));
  295.   }
  296.   print_time($estimated);
  297.   print " for count_distinct_key_prefix ($count:$rows): " .
  298.     timestr(timediff($end_time, $loop_time),"all") . "n";
  299.   $loop_time=new Benchmark;
  300.   $rows=$estimated=$count=0;
  301.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  302.   {
  303.     $count++;
  304.     $rows+=fetch_all_rows($dbh,"select count(distinct grp) from bench1");
  305.     $end_time=new Benchmark;
  306.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  307.    $opt_medium_loop_count));
  308.   }
  309.   print_time($estimated);
  310.   print " for count_distinct ($count:$rows): " .
  311.     timestr(timediff($end_time, $loop_time),"all") . "n";
  312. #  Workaround mimer's behavior
  313.   if ($limits->{'multi_distinct'})
  314.   {
  315.     $loop_time=new Benchmark;
  316.     $rows=$estimated=$count=0;
  317.     for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  318.     {
  319.       $count++;
  320.       $rows+=fetch_all_rows($dbh,"select count(distinct grp),count(distinct rev_idn) from bench1");
  321.       $end_time=new Benchmark;
  322.       last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  323.    $opt_medium_loop_count));
  324.     } 
  325.     print_time($estimated);
  326.     print " for count_distinct_2 ($count:$rows): " .
  327.       timestr(timediff($end_time, $loop_time),"all") . "n";
  328.   }
  329.   $loop_time=new Benchmark;
  330.   $rows=$estimated=$count=0;
  331.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  332.   {
  333.     $count++;
  334.     $rows+=fetch_all_rows($dbh,"select region,count(distinct idn) from bench1 group by region");
  335.     $end_time=new Benchmark;
  336.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  337.    $opt_medium_loop_count));
  338.   }
  339.   print_time($estimated);
  340.   print " for count_distinct_group_on_key ($count:$rows): " .
  341.     timestr(timediff($end_time, $loop_time),"all") . "n";
  342.   $loop_time=new Benchmark;
  343.   $rows=$estimated=$count=0;
  344.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  345.   {
  346.     $count++;
  347.     $rows+=fetch_all_rows($dbh,"select grp,count(distinct idn) from bench1 group by grp");
  348.     $end_time=new Benchmark;
  349.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  350.    $opt_medium_loop_count));
  351.   }
  352.   print_time($estimated);
  353.   print " for count_distinct_group_on_key_parts ($count:$rows): " .
  354.     timestr(timediff($end_time, $loop_time),"all") . "n";
  355.   $loop_time=new Benchmark;
  356.   $rows=$estimated=$count=0;
  357.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  358.   {
  359.     $count++;
  360.     $rows+=fetch_all_rows($dbh,"select grp,count(distinct rev_idn) from bench1 group by grp");
  361.     $end_time=new Benchmark;
  362.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  363.    $opt_medium_loop_count));
  364.   }
  365.   print_time($estimated);
  366.   print " for count_distinct_group ($count:$rows): " .
  367.     timestr(timediff($end_time, $loop_time),"all") . "n";
  368.   $loop_time=new Benchmark;
  369.   $rows=$estimated=$count=0;
  370.   $test_count=$opt_medium_loop_count/10;
  371.   for ($i=0 ; $i < $test_count ; $i++)
  372.   {
  373.     $count++;
  374.     $rows+=fetch_all_rows($dbh,"select idn,count(distinct region) from bench1 group by idn");
  375.     $end_time=new Benchmark;
  376.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  377.    $test_count));
  378.   }
  379.   print_time($estimated);
  380.   print " for count_distinct_big ($count:$rows): " .
  381.     timestr(timediff($end_time, $loop_time),"all") . "n";
  382. }
  383. ####
  384. #### End of benchmark
  385. ####
  386. if ($opt_lock_tables)
  387. {
  388.   do_query($dbh,"UNLOCK TABLES");
  389. }
  390. if (!$opt_skip_delete)
  391. {
  392.   do_query($dbh,"drop table bench1" . $server->{'drop_attr'});
  393. }
  394. if ($opt_fast && defined($server->{vacuum}))
  395. {
  396.   $server->vacuum(0,$dbh);
  397. }
  398. $dbh->disconnect; # close connection
  399. end_benchmark($start_time);