Commit f2e583c5 authored by stewart@mysql.com's avatar stewart@mysql.com

WL#3310 Update ndb_size.pl for 5.1

the "If I had a hammer" patch.

Had to answer the question, did it in code.

Much more accurrate results for 5.1
parent 7667b271
...@@ -57,7 +57,7 @@ if(@ARGV < 3 || $ARGV[0] eq '--usage' || $ARGV[0] eq '--help') ...@@ -57,7 +57,7 @@ if(@ARGV < 3 || $ARGV[0] eq '--usage' || $ARGV[0] eq '--help')
$template->param(dsn => $dsn); $template->param(dsn => $dsn);
} }
my @releases = ({rel=>'4.1'},{rel=>'5.0'},{rel=>'5.1'}); my @releases = ({rel=>'4.1'},{rel=>'5.0'},{rel=>'5.1'},{rel=>'5.1-dd'});
$template->param(releases => \@releases); $template->param(releases => \@releases);
my $tables = $dbh->selectall_arrayref("show tables"); my $tables = $dbh->selectall_arrayref("show tables");
...@@ -91,12 +91,14 @@ foreach(@{$tables}) ...@@ -91,12 +91,14 @@ foreach(@{$tables})
# We now work out the DataMemory usage # We now work out the DataMemory usage
# sizes for 4.1, 5.0, 5.1 # sizes for 4.1, 5.0, 5.1 and 5.1-dd
my @totalsize= (0,0,0); my @totalsize= (0,0,0,0);
my $nrvarsize= 0;
foreach(keys %$info) foreach(keys %$info)
{ {
my @realsize = (0,0,0); my @realsize = (0,0,0,0);
my @varsize = (0,0,0,0);
my $type; my $type;
my $size; my $size;
my $name= $_; my $name= $_;
...@@ -112,53 +114,56 @@ foreach(@{$tables}) ...@@ -112,53 +114,56 @@ foreach(@{$tables})
} }
if($type =~ /tinyint/) if($type =~ /tinyint/)
{@realsize=(1,1,1)} {@realsize=(1,1,1,1)}
elsif($type =~ /smallint/) elsif($type =~ /smallint/)
{@realsize=(2,2,2)} {@realsize=(2,2,2,2)}
elsif($type =~ /mediumint/) elsif($type =~ /mediumint/)
{@realsize=(3,3,3)} {@realsize=(3,3,3,3)}
elsif($type =~ /bigint/) elsif($type =~ /bigint/)
{@realsize=(8,8,8)} {@realsize=(8,8,8,8)}
elsif($type =~ /int/) elsif($type =~ /int/)
{@realsize=(4,4,4)} {@realsize=(4,4,4,4)}
elsif($type =~ /float/) elsif($type =~ /float/)
{ {
if($size<=24) if($size<=24)
{@realsize=(4,4,4)} {@realsize=(4,4,4,4)}
else else
{@realsize=(8,8,8)} {@realsize=(8,8,8,8)}
} }
elsif($type =~ /double/ || $type =~ /real/) elsif($type =~ /double/ || $type =~ /real/)
{@realsize=(8,8,8)} {@realsize=(8,8,8,8)}
elsif($type =~ /bit/) elsif($type =~ /bit/)
{ {
my $a=($size+7)/8; my $a=($size+7)/8;
@realsize = ($a,$a,$a); @realsize = ($a,$a,$a,$a);
} }
elsif($type =~ /datetime/) elsif($type =~ /datetime/)
{@realsize=(8,8,8)} {@realsize=(8,8,8,8)}
elsif($type =~ /timestamp/) elsif($type =~ /timestamp/)
{@realsize=(4,4,4)} {@realsize=(4,4,4,4)}
elsif($type =~ /date/ || $type =~ /time/) elsif($type =~ /date/ || $type =~ /time/)
{@realsize=(3,3,3)} {@realsize=(3,3,3,3)}
elsif($type =~ /year/) elsif($type =~ /year/)
{@realsize=(1,1,1)} {@realsize=(1,1,1,1)}
elsif($type =~ /varchar/ || $type =~ /varbinary/) elsif($type =~ /varchar/ || $type =~ /varbinary/)
{ {
my $fixed= 1+$size; my $fixed=$size+ceil($size/256);
my @dynamic=$dbh->selectrow_array("select avg(length(`" my @dynamic=$dbh->selectrow_array("select avg(length(`"
.$name .$name
."`)) from `".$table.'`'); ."`)) from `".$table.'`');
$dynamic[0]=0 if !$dynamic[0]; $dynamic[0]=0 if !$dynamic[0];
@realsize= ($fixed,$fixed,ceil($dynamic[0])); $dynamic[0]+=ceil($dynamic[0]/256); # size bit
$nrvarsize++;
$varsize[3]= ceil($dynamic[0]);
@realsize= ($fixed,$fixed,ceil($dynamic[0]),$fixed);
} }
elsif($type =~ /binary/ || $type =~ /char/) elsif($type =~ /binary/ || $type =~ /char/)
{@realsize=($size,$size,$size)} {@realsize=($size,$size,$size,$size)}
elsif($type =~ /text/ || $type =~ /blob/) elsif($type =~ /text/ || $type =~ /blob/)
{ {
@realsize=(256,256,1); @realsize=(256,256,256,256);
$NoOfTables[$_]{val} += 1 foreach 0..$#releases; # blob uses table $NoOfTables[$_]{val} += 1 foreach 0..$#releases; # blob uses table
} # FIXME check if 5.1 is correct }
@realsize= align(4,@realsize); @realsize= align(4,@realsize);
...@@ -212,20 +217,20 @@ foreach(@{$tables}) ...@@ -212,20 +217,20 @@ foreach(@{$tables})
type=>'bigint', type=>'bigint',
size=>8, size=>8,
key=>'PRI', key=>'PRI',
datamemory=>[{val=>8},{val=>8},{val=>8}], datamemory=>[{val=>8},{val=>8},{val=>8},{val=>8}],
}; };
$columnsize{'HIDDEN_NDB_PKEY'}= [8,8,8]; $columnsize{'HIDDEN_NDB_PKEY'}= [8,8,8];
} }
my @IndexDataMemory= ({val=>0},{val=>0},{val=>0}); my @IndexDataMemory= ({val=>0},{val=>0},{val=>0},{val=>0});
my @RowIndexMemory= ({val=>0},{val=>0},{val=>0}); my @RowIndexMemory= ({val=>0},{val=>0},{val=>0},{val=>0});
my @indexes; my @indexes;
foreach my $index (keys %indexes) { foreach my $index (keys %indexes) {
my $im41= 25; my $im41= 25;
$im41+=$columnsize{$_}[0] foreach @{$indexes{$index}{columns}}; $im41+=$columnsize{$_}[0] foreach @{$indexes{$index}{columns}};
my @im = ({val=>$im41},{val=>25},{val=>25}); my @im = ({val=>$im41},{val=>25},{val=>25},{val=>25});
my @dm = ({val=>10},{val=>10},{val=>10}); my @dm = ({val=>10},{val=>10},{val=>10},{val=>10});
push @indexes, { push @indexes, {
name=>$index, name=>$index,
type=>$indexes{$index}{type}, type=>$indexes{$index}{type},
...@@ -233,13 +238,22 @@ foreach(@{$tables}) ...@@ -233,13 +238,22 @@ foreach(@{$tables})
indexmemory=>\@im, indexmemory=>\@im,
datamemory=>\@dm, datamemory=>\@dm,
}; };
$IndexDataMemory[$_]{val}+=$dm[$_]{val} foreach 0..2; $IndexDataMemory[$_]{val}+=$dm[$_]{val} foreach 0..$#releases;
$RowIndexMemory[$_]{val}+=$im[$_]{val} foreach 0..2; $RowIndexMemory[$_]{val}+=$im[$_]{val} foreach 0..$#releases;
} }
# total size + 16 bytes overhead # total size + 16 bytes overhead
my @TotalDataMemory; my @TotalDataMemory;
$TotalDataMemory[$_]{val}=$IndexDataMemory[$_]{val}+$totalsize[$_]+16 foreach 0..2; my @RowOverhead = ({val=>16},{val=>16},{val=>16},{val=>24});
# 5.1 has ptr to varsize page, and per-varsize overhead
my @nrvarsize_mem= ({val=>0},{val=>0},
{val=>8},{val=>0});
{
my @a= align(4,$nrvarsize*2);
$nrvarsize_mem[2]{val}+=$a[0]+$nrvarsize*4;
}
$TotalDataMemory[$_]{val}=$IndexDataMemory[$_]{val}+$totalsize[$_]+$RowOverhead[$_]{val}+$nrvarsize_mem[$_]{val} foreach 0..$#releases;
my @RowDataMemory; my @RowDataMemory;
push @RowDataMemory,{val=>$_} foreach @totalsize; push @RowDataMemory,{val=>$_} foreach @totalsize;
...@@ -260,12 +274,18 @@ foreach(@{$tables}) ...@@ -260,12 +274,18 @@ foreach(@{$tables})
my @counts; my @counts;
$counts[$_]{val}= $count foreach 0..$#releases; $counts[$_]{val}= $count foreach 0..$#releases;
my @nrvarsize_rel= ({val=>0},{val=>0},
{val=>$nrvarsize},{val=>0});
push @table_size, { push @table_size, {
table=>$table, table=>$table,
indexes=>\@indexes, indexes=>\@indexes,
columns=>\@columns, columns=>\@columns,
count=>\@counts, count=>\@counts,
RowOverhead=>\@RowOverhead,
RowDataMemory=>\@RowDataMemory, RowDataMemory=>\@RowDataMemory,
nrvarsize=>\@nrvarsize_rel,
nrvarsize_mem=>\@nrvarsize_mem,
releases=>\@releases, releases=>\@releases,
IndexDataMemory=>\@IndexDataMemory, IndexDataMemory=>\@IndexDataMemory,
TotalDataMemory=>\@TotalDataMemory, TotalDataMemory=>\@TotalDataMemory,
......
...@@ -15,6 +15,8 @@ td,th { border: 1px solid black } ...@@ -15,6 +15,8 @@ td,th { border: 1px solid black }
<p>This information should be valid for MySQL 4.1 and 5.0. Since 5.1 is not a final release yet, the numbers should be used as a guide only.</p> <p>This information should be valid for MySQL 4.1 and 5.0. Since 5.1 is not a final release yet, the numbers should be used as a guide only.</p>
<p>5.1-dd is for tables stored on disk. The ndb_size.pl estimates are <b>experimental</b> and should not be trusted. Notably we don't take into account indexed columns being in DataMemory versus non-indexed on disk.</p>
<h2>Parameter Settings</h2> <h2>Parameter Settings</h2>
<p><b>NOTE</b> the configuration parameters below do not take into account system tables and other requirements.</p> <p><b>NOTE</b> the configuration parameters below do not take into account system tables and other requirements.</p>
<table> <table>
...@@ -128,10 +130,22 @@ td,th { border: 1px solid black } ...@@ -128,10 +130,22 @@ td,th { border: 1px solid black }
<th><TMPL_VAR NAME=rel></th> <th><TMPL_VAR NAME=rel></th>
</TMPL_LOOP> </TMPL_LOOP>
</tr> </tr>
<tr>
<th>Nr Varsized Attributes</th>
<TMPL_LOOP NAME=nrvarsize>
<td><TMPL_VAR NAME=val></td>
</TMPL_LOOP>
</tr>
<tr> <tr>
<th>Row Overhead</th> <th>Row Overhead</th>
<TMPL_LOOP NAME=releases> <TMPL_LOOP NAME=RowOverhead>
<td>16</td> <td><TMPL_VAR NAME=val></td>
</TMPL_LOOP>
</tr>
<tr>
<th>Varsized Overhead</th>
<TMPL_LOOP NAME=nrvarsize_mem>
<td><TMPL_VAR NAME=val></td>
</TMPL_LOOP> </TMPL_LOOP>
</tr> </tr>
<tr> <tr>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment