Hi, On 2023-03-09 12:15:16 -0800, Mark Dilger wrote: > > Somewhat random note: > > > > Is it intentional that we VACUUM FREEZE test ROWCOUNT times? That's > > effectively O(ROWCOUNT^2), albeit with small enough constants to not really > > matter. I don't think we need to insert the rows one-by-one either. Changing > > that to a single INSERT and FREEZE shaves 10-12% off the tests. I didn't > > change that, but we also fire off a psql for each tuple for > > heap_page_items(), > > with offset $N no less. That seems to be another 500ms. > > I don't recall the reasoning. Feel free to optimize the tests.
Something like the attached. I don't know enough perl to know how to interpolate something like use constant ROWCOUNT => 17; so I just made it a variable. Greetings, Andres Freund
>From a01e1481505e74097112c0ea358e7e0eef6a5684 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Sat, 11 Mar 2023 15:15:35 -0800 Subject: [PATCH v1] pg_amcheck: Minor test speedups Discussion: https://postgr.es/m/20230309001558.b7shzvio645eb...@awork3.anarazel.de --- src/bin/pg_amcheck/t/004_verify_heapam.pl | 33 +++++++++++------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/bin/pg_amcheck/t/004_verify_heapam.pl b/src/bin/pg_amcheck/t/004_verify_heapam.pl index 9984d0d9f87..e5ae7e6aada 100644 --- a/src/bin/pg_amcheck/t/004_verify_heapam.pl +++ b/src/bin/pg_amcheck/t/004_verify_heapam.pl @@ -217,17 +217,17 @@ my $rel = $node->safe_psql('postgres', my $relpath = "$pgdata/$rel"; # Insert data and freeze public.test -use constant ROWCOUNT => 17; +my $ROWCOUNT = 17; $node->safe_psql( 'postgres', qq( INSERT INTO public.test (a, b, c) - VALUES ( + SELECT x'DEADF9F9DEADF9F9'::bigint, 'abcdefg', repeat('w', 10000) - ); - VACUUM FREEZE public.test - )) for (1 .. ROWCOUNT); + FROM generate_series(1, $ROWCOUNT); + VACUUM FREEZE public.test;) +); my $relfrozenxid = $node->safe_psql('postgres', q(select relfrozenxid from pg_class where relname = 'test')); @@ -246,16 +246,13 @@ if ($datfrozenxid <= 3 || $datfrozenxid >= $relfrozenxid) } # Find where each of the tuples is located on the page. -my @lp_off; -for my $tup (0 .. ROWCOUNT - 1) -{ - push( - @lp_off, - $node->safe_psql( - 'postgres', qq( -select lp_off from heap_page_items(get_raw_page('test', 'main', 0)) - offset $tup limit 1))); -} +my @lp_off = split '\n', $node->safe_psql( + 'postgres', qq( + select lp_off from heap_page_items(get_raw_page('test', 'main', 0)) + where lp <= $ROWCOUNT + ) +); +is(scalar @lp_off, $ROWCOUNT, "acquired row offsets"); # Sanity check that our 'test' table on disk layout matches expectations. If # this is not so, we will have to skip the test until somebody updates the test @@ -267,7 +264,7 @@ open($file, '+<', $relpath) binmode $file; my $ENDIANNESS; -for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++) +for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++) { my $offnum = $tupidx + 1; # offnum is 1-based, not zero-based my $offset = $lp_off[$tupidx]; @@ -345,7 +342,7 @@ open($file, '+<', $relpath) or BAIL_OUT("open failed: $!"); binmode $file; -for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++) +for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++) { my $offnum = $tupidx + 1; # offnum is 1-based, not zero-based my $offset = $lp_off[$tupidx]; @@ -522,7 +519,7 @@ for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++) $tup->{t_infomask} &= ~HEAP_XMIN_INVALID; push @expected, - qr/${$header}xmin ${xmin} equals or exceeds next valid transaction ID 0:\d+/; + qr/${$header}xmin ${xmin} equals or exceeds next valid transaction ID 0:\d+/; } write_tuple($file, $offset, $tup); } -- 2.38.0