Changeset 252

Show
Ignore:
Timestamp:
06/24/11 17:46:03 (3 years ago)
Author:
depesz
Message:

In case of most-common-values split of table into blobs - get into consideration also percentages to order blobs correctly by size

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/tools/fast.dump.and.restore/fast.dump

    r251 r252  
    7171    open my $fh, ">", File::Spec->catfile( $self->{ 'output' }, 'index.lst' ) or croak( "Cannot create index file: $OS_ERROR\n" ); 
    7272    printf $fh '%-5s | %-7s | %-32s | %-32s | %-10s | %s%s', '#', qw( type schema table size condition ), "\n"; 
    73     for my $i ( @{ $self->{'blobs'} } ) { 
    74         printf $fh '%5d | %-7s | %-32s | %-32s | %-10s | %s%s', @{ $i }{ qw( id blob_type schema table size ) }, ( $i->{'condition'} || '' ), "\n"; 
     73    for my $i ( @{ $self->{ 'blobs' } } ) { 
     74        printf $fh '%5d | %-7s | %-32s | %-32s | %-10s | %s%s', @{ $i }{ qw( id blob_type schema table size ) }, ( $i->{ 'condition' } || '' ), "\n"; 
    7575    } 
    7676 
     
    8080        my @pids = keys %killed_pids; 
    8181        for my $killed ( @pids ) { 
    82             my $blob     = delete $running_kids{ $killed }; 
     82            my $blob = delete $running_kids{ $killed }; 
    8383            next unless $blob; 
    8484            my $end_time = delete $killed_pids{ $killed }; 
     
    242242            SELECT 
    243243                s2.starelid, 
    244                 quote_literal(s2.vals[i]) 
     244                quote_literal(s2.vals[i]), 
     245                s2.probability[i] 
    245246            FROM 
    246247                ( 
     
    262263                                when s.stakind4 = 1 THEN stavalues4 
    263264                                ELSE NULL 
    264                                 END::TEXT::%s[] as vals 
     265                                END::TEXT::%s[] as vals, 
     266                                case 
     267                                when 2 in (s.stakind1, s.stakind2, s.stakind3, s.stakind4) THEN NULL::real[] 
     268                                when s.stakind1 = 1 THEN stanumbers1 
     269                                when s.stakind2 = 1 THEN stanumbers2 
     270                                when s.stakind3 = 1 THEN stanumbers3 
     271                                when s.stakind4 = 1 THEN 
     272                                stanumbers4 
     273                                ELSE 
     274                                NULL::real[] 
     275                                END as probability 
    265276                            FROM 
    266277                                pg_statistic s 
     
    280291 
    281292    for my $row ( @{ $partitions } ) { 
    282         push @{ $oids{ $row->[ 0 ] }->{ 'partition_values' } }, $row->[ 1 ]; 
     293        push @{ $oids{ $row->[ 0 ] }->{ 'partition_values' } }, 
     294            { 
     295            'value'       => $row->[ 1 ], 
     296            'probability' => $row->[ 2 ], 
     297            }; 
    283298    } 
    284299 
    285300    for my $table ( @to_split ) { 
    286         if ( 
    287             ( !defined $table->{ 'partition_values' } ) || 
    288             ( 0 == scalar @{ $table->{ 'partition_values' } } ) 
    289         ) { 
     301        if (   ( !defined $table->{ 'partition_values' } ) 
     302            || ( 0 == scalar @{ $table->{ 'partition_values' } } ) ) 
     303        { 
    290304            $table->{ 'blob_type' } = 'full'; 
    291305            push @blobs, $table; 
     
    299313            $blob->{ 'blob_type' } = 'partial'; 
    300314            if ( $i == 0 ) { 
    301                 $blob->{ 'condition' } = sprintf "%s < %s", $table->{ 'partition_key' }, $table->{ 'partition_values' }->[ $i ]; 
    302                 $blob->{ 'size' } = 0; 
     315                $blob->{ 'condition' } = sprintf "%s <= %s", $table->{ 'partition_key' }, $table->{ 'partition_values' }->[ $i ]->{ 'value' }; 
     316                if ( $table->{ 'partition_values' }->[ $i ]->{ 'probability' } ) { 
     317                    $blob->{ 'size' } *= $table->{ 'partition_values' }->[ $i ]->{ 'probability' }; 
     318                } 
     319                else { 
     320                    $blob->{ 'size' } = 0; 
     321                } 
    303322            } 
    304323            else { 
    305                 $blob->{ 'condition' } = sprintf "%s >= %s and %s < %s", $table->{ 'partition_key' }, $table->{ 'partition_values' }->[ $i - 1 ], $table->{ 'partition_key' }, 
    306                     $table->{ 'partition_values' }->[ $i ]; 
    307                 $blob->{ 'size' } /= ( scalar( @{ $table->{ 'partition_values' } } ) - 1 ); 
     324                $blob->{ 'condition' } = sprintf "%s > %s and %s <= %s", $table->{ 'partition_key' }, $table->{ 'partition_values' }->[ $i - 1 ]->{ 'value' }, $table->{ 'partition_key' }, 
     325                    $table->{ 'partition_values' }->[ $i ]->{ 'value' }; 
     326                if ( $table->{ 'partition_values' }->[ $i ]->{ 'probability' } ) { 
     327                    $blob->{ 'size' } *= $table->{ 'partition_values' }->[ $i ]->{ 'probability' }; 
     328                } 
     329                else { 
     330                    $blob->{ 'size' } /= ( scalar( @{ $table->{ 'partition_values' } } ) - 1 ); 
     331                } 
    308332            } 
    309333            push @blobs, $blob; 
    310334        } 
    311335        $table->{ 'blob_type' } = 'partial'; 
    312         $table->{ 'size' } /= ( scalar( @{ $table->{ 'partition_values' } } ) - 1 ); 
    313         if ( !defined $table->{'partition_values'}->[-1] ) { 
    314             print Dumper( $table ) . "PV\n"; 
    315         } 
    316         if ( !defined $table->{'partition_key'} ) { 
    317             print Dumper( $table ) . "PK\n"; 
    318         } 
    319         $table->{ 'condition' } = sprintf "%s >= %s", $table->{ 'partition_key' }, $table->{ 'partition_values' }->[ -1 ]; 
     336        $table->{ 'size' }      = 0; 
     337        $table->{ 'condition' } = sprintf "%s > %s", $table->{ 'partition_key' }, $table->{ 'partition_values' }->[ -1 ]->{ 'value' }; 
    320338        delete $table->{ 'partition_key' }; 
    321339        delete $table->{ 'partition_values' }; 
     
    343361    } 
    344362 
    345     my $db_sizes = $self->psql( 
    346 
     363    my $db_sizes = $self->psql( " 
    347364    SELECT 
    348365        n.nspname,