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

模拟服务器

开发平台:

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