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


Reply via email to