Hi,
On 2023-09-07 21:45:22 -0700, Andres Freund wrote:
> In contrast to that, freezing will almost always trigger an FPI (except for
> empty pages, but we imo ought to stop setting empty pages all frozen [1]).
>
>
> Yep, a quick experiment confirms that:
>
> DROP TABLE IF EXISTS foo;
> CREATE TABLE foo AS SELECT generate_series(1, 10000000);
> CHECKPOINT;
> VACUUM (VERBOSE) foo;
>
> checksums off: WAL usage: 44249 records, 3 full page images, 2632091 bytes
> checksums on: WAL usage: 132748 records, 44253 full page images, 388758161
> bytes
>
>
> I initially was confused by the 3x wal records - I was expecting 2x. The
> reason is that with checksums on, we emit an FPI during the visibility check,
> which then triggers the current heuristic for opportunistic freezing. The
> saving grace is that WAL volume is completely dominated by the FPIs:
>
> Type N (%) Record
> size (%) FPI size (%) Combined size (%)
> ---- - ---
> ----------- --- -------- --- -------------
> ---
> XLOG/FPI_FOR_HINT 44253 ( 33.34)
> 2168397 ( 7.84) 361094232 (100.00) 363262629 ( 93.44)
> Transaction/INVALIDATION 1 ( 0.00)
> 78 ( 0.00) 0 ( 0.00) 78 ( 0.00)
> Standby/INVALIDATIONS 1 ( 0.00)
> 90 ( 0.00) 0 ( 0.00) 90 ( 0.00)
> Heap2/FREEZE_PAGE 44248 ( 33.33)
> 22876120 ( 82.72) 0 ( 0.00) 22876120 ( 5.88)
> Heap2/VISIBLE 44248 ( 33.33)
> 2610642 ( 9.44) 16384 ( 0.00) 2627026 ( 0.68)
> Heap/INPLACE 1 ( 0.00)
> 188 ( 0.00) 0 ( 0.00) 188 ( 0.00)
> --------
> -------- -------- --------
> Total 132752
> 27655515 [7.11%] 361110616 [92.89%] 388766131 [100%]
>
> In realistic tables, where rows are wider than a single int, FPI_FOR_HINT
> dominates even further, as the FREEZE_PAGE would be smaller if there weren't
> 226 tuples on each page...
The above is not a great demonstration of the overhead of setting all-visible,
as the FPIs are triggered via FPI_FOR_HINTs, independent of setting
all-visible. Adding "SELECT count(*) FROM foo" before the checkpoint sets them
earlier and results in:
checksum off:
WAL usage: 44249 records, 3 full page images, 2627915 bytes
Type N (%) Record size
(%) FPI size (%) Combined size (%)
---- - --- -----------
--- -------- --- ------------- ---
Transaction/INVALIDATION 1 ( 0.00) 78
( 0.00) 0 ( 0.00) 78 ( 0.00)
Standby/INVALIDATIONS 1 ( 0.00) 90
( 0.00) 0 ( 0.00) 90 ( 0.00)
Heap2/VISIBLE 44248 ( 99.99) 2610642
( 99.99) 16384 ( 95.15) 2627026 ( 99.96)
Heap/INPLACE 1 ( 0.00) 53
( 0.00) 836 ( 4.85) 889 ( 0.03)
-------- --------
-------- --------
Total 44251 2610863
[99.34%] 17220 [0.66%] 2628083 [100%]
checksums on:
WAL usage: 44252 records, 44254 full page images, 363935830 bytes
Type N (%) Record size
(%) FPI size (%) Combined size (%)
---- - --- -----------
--- -------- --- ------------- ---
XLOG/FPI_FOR_HINT 3 ( 0.01) 147
( 0.01) 24576 ( 0.01) 24723 ( 0.01)
Transaction/INVALIDATION 1 ( 0.00) 78
( 0.00) 0 ( 0.00) 78 ( 0.00)
Standby/INVALIDATIONS 1 ( 0.00) 90
( 0.00) 0 ( 0.00) 90 ( 0.00)
Heap2/VISIBLE 44248 ( 99.99) 2831882
( 99.99) 361078336 ( 99.99) 363910218 ( 99.99)
Heap/INPLACE 1 ( 0.00) 53
( 0.00) 836 ( 0.00) 889 ( 0.00)
-------- --------
-------- --------
Total 44254 2832250
[0.78%] 361103748 [99.22%] 363935998 [100%]
Moving the hint bit setting to before the checkpoint also "avoids" the
freezing.
Greetings,
Andres Freund