Improved streaming test

This commit is contained in:
Andrew Kane
2024-09-20 11:13:03 -07:00
parent 3fd6a29c49
commit 79851729f1

View File

@@ -8,16 +8,17 @@ my $node;
my @queries = (); my @queries = ();
my @expected; my @expected;
my $limit = 20; my $limit = 20;
my $c = 1000; my @cs = (100, 1000);
sub test_recall sub test_recall
{ {
my ($min, $operator) = @_; my ($c, $probes, $min, $operator) = @_;
my $correct = 0; my $correct = 0;
my $total = 0; my $total = 0;
my $explain = $node->safe_psql("postgres", qq( my $explain = $node->safe_psql("postgres", qq(
SET enable_seqscan = off; SET enable_seqscan = off;
SET ivfflat.probes = $probes;
SET ivfflat.streaming = on; SET ivfflat.streaming = on;
EXPLAIN ANALYZE SELECT i FROM tst WHERE i % $c = 0 ORDER BY v $operator '$queries[0]' LIMIT $limit; EXPLAIN ANALYZE SELECT i FROM tst WHERE i % $c = 0 ORDER BY v $operator '$queries[0]' LIMIT $limit;
)); ));
@@ -27,6 +28,7 @@ sub test_recall
{ {
my $actual = $node->safe_psql("postgres", qq( my $actual = $node->safe_psql("postgres", qq(
SET enable_seqscan = off; SET enable_seqscan = off;
SET ivfflat.probes = $probes;
SET ivfflat.streaming = on; SET ivfflat.streaming = on;
SELECT i FROM tst WHERE i % $c = 0 ORDER BY v $operator '$queries[$i]' LIMIT $limit; SELECT i FROM tst WHERE i % $c = 0 ORDER BY v $operator '$queries[$i]' LIMIT $limit;
)); ));
@@ -79,28 +81,42 @@ for my $i (0 .. $#operators)
my $operator = $operators[$i]; my $operator = $operators[$i];
my $opclass = $opclasses[$i]; my $opclass = $opclasses[$i];
# Get exact results
@expected = ();
foreach (@queries)
{
my $res = $node->safe_psql("postgres", qq(
WITH top AS (
SELECT v $operator '$_' AS distance FROM tst WHERE i % $c = 0 ORDER BY distance LIMIT $limit
)
SELECT i FROM tst WHERE (v $operator '$_') <= (SELECT MAX(distance) FROM top)
));
push(@expected, $res);
}
$node->safe_psql("postgres", "CREATE INDEX idx ON tst USING ivfflat (v $opclass);"); $node->safe_psql("postgres", "CREATE INDEX idx ON tst USING ivfflat (v $opclass);");
if ($operator eq "<->") foreach (@cs)
{ {
test_recall(0.80, $operator); my $c = $_;
}
else # Get exact results
{ @expected = ();
test_recall(0.90, $operator); foreach (@queries)
{
my $res = $node->safe_psql("postgres", qq(
SET enable_indexscan = off;
WITH top AS (
SELECT v $operator '$_' AS distance FROM tst WHERE i % $c = 0 ORDER BY distance LIMIT $limit
)
SELECT i FROM tst WHERE (v $operator '$_') <= (SELECT MAX(distance) FROM top)
));
push(@expected, $res);
}
if ($c == 100)
{
test_recall($c, 1, 0.60, $operator);
test_recall($c, 10, 0.98, $operator);
}
else
{
if ($operator eq "<->")
{
test_recall($c, 1, 0.80, $operator);
}
else
{
test_recall($c, 1, 0.88, $operator);
}
}
} }
$node->safe_psql("postgres", "DROP INDEX idx;"); $node->safe_psql("postgres", "DROP INDEX idx;");