Re: Add TOAST statistics columns to pg_stat_all_tables

From: Toshiki Toda <toshiki(dot)toda(dot)pgtech(at)gmail(dot)com>
To: Shinya Kato <shinya11(dot)kato(at)gmail(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Add TOAST statistics columns to pg_stat_all_tables
Date: 2026-09-15 00:02:34
Message-ID: CAO-ocS4SHpLJMkmmDTa3NooRcVgjAGdT5a_jeUwBhyMzg=D_JA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi Kato-san,

Thank you for working on the patch.

There may be room for further discussion regarding the design, but from a
testing perspective, I did not find any issues.

I tested the patch against the current master on Rocky Linux 9.
However, it did not apply cleanly due to conflicts in
src/test/regress/sql/stats.sql and src/test/regress/expected/stats.out.
After resolving the conflicts locally, I tested the patch and did not find
any issues.

I confirmed the following:

- TAP tests
- Passed successfully.

- pg_stat_all_tables
- Confirmed that the TOAST-related columns were added successfully.
- Confirmed that the values are displayed correctly.
- Verified cases where dead tuples were generated and subsequently removed
by autovacuum.

- pg_stat_user_tables
- Confirmed that the TOAST-related columns were added successfully.
- Confirmed that the values are displayed correctly.
- Verified cases where dead tuples were generated and subsequently removed
by autovacuum.

- pg_stat_sys_tables
- Confirmed that the TOAST-related columns were added successfully.
- Confirmed that the values are displayed correctly.
- However, I was not able to create a test case in which dead tuples were
generated for a system table's TOAST relation.
It may be worth considering whether an additional test case is needed
for this scenario.

For reference, I have attached the rebased patch that I used for testing.

Regards,
Toshiki Toda

2026年8月5日(水) 22:28 Shinya Kato <shinya11(dot)kato(at)gmail(dot)com>:

> Hi hackers,
>
> I am proposing a patch that adds four columns to pg_stat_all_tables
> (toast_relid, toast_n_dead_tup, toast_last_autovacuum, and
> toast_autovacuum_count), so that the state of a table's TOAST table
> can be observed from the owning table's row.
>
> Motivation:
>
> Statistics for TOAST tables already exist, but they are hard to reach
> when troubleshooting. They appear only as separate rows in the
> pg_toast schema, pg_stat_user_tables filters that schema out entirely,
> and autovacuum processes a TOAST table independently of its main
> table. As a result, a table can look perfectly healthy (n_dead_tup =
> 0, recently autovacuumed) while most of the dead space is in its TOAST
> table, and nothing in the standard views hints that one should join
> pg_class.reltoastrelid by hand. The typical symptom is that
> pg_table_size() keeps growing while n_dead_tup stays near zero.
>
> Design:
>
> pg_statio_all_tables already exposes TOAST activity on the owning
> table's row (toast_blks_read and toast_blks_hit) by joining pg_class
> on reltoastrelid, so this patch applies the same pattern to
> pg_stat_all_tables. The new columns call the existing statistics
> functions on the TOAST relation's OID, so no new counters or C
> functions are introduced, and tables without a TOAST table show NULLs.
> The TOAST values are deliberately not folded into the table's own
> counters, because TOAST tuples are chunks of long values and mixing
> the units would make the numbers meaningless.
>
> The patch is attached.
>
> Thoughts?
>
> --
> Best regards,
> Shinya Kato
> NTT OSS Center
>

Attachment Content-Type Size
v1-0001-Add-TOAST-statistics-columns-to-pg_stat_all_table.patch application/octet-stream 10.8 KB

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Jacob Champion 2026-09-15 00:08:18 Re: [PATCH] Explain what the default output_plugin_libraries do
Previous Message Paul Kim 2026-09-14 23:59:26 Re: Be strict when request to flush past end of WAL in WaitXLogInsertionsToFinish