bench-count-distinct
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

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=200;
  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. $query="insert into bench1 values (";
  81. $half_done=$opt_loop_count/2;
  82. for ($id=0,$rev_id=$opt_loop_count-1 ; $id < $opt_loop_count ; $id++,$rev_id--)
  83. {
  84.   $grp=$id*3 % $opt_groups;
  85.   $region=chr(65+$id%$opt_regions);
  86.   do_query($dbh,"$query'$region',$id,$rev_id,$grp)");
  87.   if ($id == $half_done)
  88.   { # Test with different insert
  89.     $query="insert into bench1 (region,idn,rev_idn,grp) values (";
  90.   }
  91. }
  92. $end_time=new Benchmark;
  93. print "Time to insert ($opt_loop_count): " .
  94.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  95. if ($opt_lock_tables)
  96. {
  97.   do_query($dbh,"UNLOCK TABLES");
  98. }
  99. if ($opt_fast && defined($server->{vacuum}))
  100. {
  101.   $server->vacuum(0,$dbh,"bench1");
  102. }
  103. if ($opt_lock_tables)
  104. {
  105.   do_query($dbh,"LOCK TABLES bench1 WRITE");
  106. }
  107. ####
  108. #### Do some selects on the table
  109. ####
  110. select_test:
  111. if ($limits->{'group_distinct_functions'})
  112. {
  113.   print "Testing count(distinct) on the tablen";
  114.   $loop_time=new Benchmark;
  115.   $rows=$estimated=$count=0;
  116.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  117.   {
  118.     $count++;
  119.     $rows+=fetch_all_rows($dbh,"select count(distinct region) from bench1");
  120.     $end_time=new Benchmark;
  121.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  122.    $opt_medium_loop_count));
  123.   }
  124.   print_time($estimated);
  125.   print " for count_distinct_key_prefix ($count:$rows): " .
  126.     timestr(timediff($end_time, $loop_time),"all") . "n";
  127.   $loop_time=new Benchmark;
  128.   $rows=$estimated=$count=0;
  129.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  130.   {
  131.     $count++;
  132.     $rows+=fetch_all_rows($dbh,"select count(distinct grp) from bench1");
  133.     $end_time=new Benchmark;
  134.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  135.    $opt_medium_loop_count));
  136.   }
  137.   print_time($estimated);
  138.   print " for count_distinct ($count:$rows): " .
  139.     timestr(timediff($end_time, $loop_time),"all") . "n";
  140.   $loop_time=new Benchmark;
  141.   $rows=$estimated=$count=0;
  142.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  143.   {
  144.     $count++;
  145.     $rows+=fetch_all_rows($dbh,"select count(distinct grp),count(distinct rev_idn) from bench1");
  146.     $end_time=new Benchmark;
  147.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  148.    $opt_medium_loop_count));
  149.   }
  150.   print_time($estimated);
  151.   print " for count_distinct_2 ($count:$rows): " .
  152.     timestr(timediff($end_time, $loop_time),"all") . "n";
  153.   $loop_time=new Benchmark;
  154.   $rows=$estimated=$count=0;
  155.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  156.   {
  157.     $count++;
  158.     $rows+=fetch_all_rows($dbh,"select region,count(distinct idn) from bench1 group by region");
  159.     $end_time=new Benchmark;
  160.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  161.    $opt_medium_loop_count));
  162.   }
  163.   print_time($estimated);
  164.   print " for count_distinct_group_on_key ($count:$rows): " .
  165.     timestr(timediff($end_time, $loop_time),"all") . "n";
  166.   $loop_time=new Benchmark;
  167.   $rows=$estimated=$count=0;
  168.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  169.   {
  170.     $count++;
  171.     $rows+=fetch_all_rows($dbh,"select grp,count(distinct idn) from bench1 group by grp");
  172.     $end_time=new Benchmark;
  173.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  174.    $opt_medium_loop_count));
  175.   }
  176.   print_time($estimated);
  177.   print " for count_distinct_group_on_key_parts ($count:$rows): " .
  178.     timestr(timediff($end_time, $loop_time),"all") . "n";
  179.   $loop_time=new Benchmark;
  180.   $rows=$estimated=$count=0;
  181.   for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
  182.   {
  183.     $count++;
  184.     $rows+=fetch_all_rows($dbh,"select grp,count(distinct rev_idn) from bench1 group by grp");
  185.     $end_time=new Benchmark;
  186.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  187.    $opt_medium_loop_count));
  188.   }
  189.   print_time($estimated);
  190.   print " for count_distinct_group ($count:$rows): " .
  191.     timestr(timediff($end_time, $loop_time),"all") . "n";
  192.   $loop_time=new Benchmark;
  193.   $rows=$estimated=$count=0;
  194.   $test_count=$opt_medium_loop_count/10;
  195.   for ($i=0 ; $i < $test_count ; $i++)
  196.   {
  197.     $count++;
  198.     $rows+=fetch_all_rows($dbh,"select idn,count(distinct region) from bench1 group by idn");
  199.     $end_time=new Benchmark;
  200.     last if ($estimated=predict_query_time($loop_time,$end_time,$count,$i+1,
  201.    $test_count));
  202.   }
  203.   print_time($estimated);
  204.   print " for count_distinct_big ($count:$rows): " .
  205.     timestr(timediff($end_time, $loop_time),"all") . "n";
  206. }
  207. ####
  208. #### End of benchmark
  209. ####
  210. if ($opt_lock_tables)
  211. {
  212.   do_query($dbh,"UNLOCK TABLES");
  213. }
  214. if (!$opt_skip_delete)
  215. {
  216.   do_query($dbh,"drop table bench1" . $server->{'drop_attr'});
  217. }
  218. if ($opt_fast && defined($server->{vacuum}))
  219. {
  220.   $server->vacuum(0,$dbh);
  221. }
  222. $dbh->disconnect; # close connection
  223. end_benchmark($start_time);