partial_indexes.pl
text/x-perl-script
#!perl
use strict;
use warnings;
use DBI;
use DBD::Pg;
my @connect = ("dbi:Pg:", '', '', {pg_enable_utf8 => 1, RaiseError => 1, PrintError => 0, AutoCommit => 1});
my $dbh = DBI->connect(@connect) or die;
$dbh->do(q{
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id serial PRIMARY KEY,
partial boolean NOT NULL,
data bigint NOT NULL
);
ALTER TABLE t1 SET (autovacuum_enabled = false);
INSERT INTO t1(partial, data) SELECT FALSE, -gs.i FROM generate_series(1, 1000000) gs(i);
CREATE INDEX i_love_partial_indexes ON t1 (id) WHERE partial;
CREATE INDEX pkish ON t1 ((id::text));
INSERT INTO t1 (partial, data) VALUES (TRUE, 0);
});
$dbh->do(q{VACUUM ANALYZE t1});
my $rows = $dbh->selectall_arrayref(q{SELECT id FROM t1 WHERE partial});
die unless (scalar(@$rows) == 1 && scalar(@{$rows->[0]}) == 1);
my $partial_id = $rows->[0]->[0];
for (my $i = 0; $i < 256 * 1024; ++$i) {
my $rows = $dbh->selectall_arrayref(
q{UPDATE t1 SET data = data + 1, partial = random() < 0.7 WHERE id = $1 RETURNING partial::int},
undef,
$partial_id,
);
die unless (scalar(@$rows) == 1 && scalar(@{$rows->[0]}) == 1);
my $partial = $rows->[0]->[0];
if ($partial == 1) {
$dbh->do(
q{UPDATE t1 SET partial = TRUE WHERE id = $1},
undef,
$partial_id,
);
}
}