On Thu, Mar 20, 2025 at 7:40 AM Paul Allen <paulcrt...@gmail.com> wrote:

> Hello.
>
> Preconditions.
>
> I have some empty table and constantly try to execute `insert ... on
> conflict do update ...` on it. My data in row which I try to insert is
> invalid by violation of foreing key constraint, so I am getting error
> while inserting and table keeps being empty. This table have some bytea
> columns with default storage type. It's purpose is to keep images.
> PostgreSQL version is 15, everything is default, autovacuum settings is
>
> ```
> autovacuum  on
> autovacuum_analyze_scale_factor  0.1
> autovacuum_analyze_threshold  50
> autovacuum_freeze_max_age  200000000
> autovacuum_max_workers  3
> autovacuum_multixact_freeze_max_age  400000000
> autovacuum_naptime  60
> autovacuum_vacuum_cost_delay  20
> autovacuum_vacuum_cost_limit  -1
> autovacuum_vacuum_scale_factor  0.2
> autovacuum_vacuum_threshold  50
> autovacuum_work_mem  -1
> log_autovacuum_min_duration  -1
>

Your _scale_factor values are too high.  Drop them down to about 5%.

That's not the proximate cause, though.


> ```
>
> Problem.
>
> My backend application attempts unsuccessfully repeatedly to insert the
> same ~100 rows with images,


Instantaneously and repeatedly, while ignoring the error?


> and despite table's row count remains 0,
> toast table's size is growing up permanently, reaching 100, 200, 300 GB
> until it takes all available space.
>
> VACUUM FULL fixes this, but a want some automatic solution. I tried to
> alter table, believing that the settings below would force autovacuum to
> clean toast anyway, but it had no effect.
>
> ```
> alter table controlzone_passage set (
> autovacuum_enabled = true,
> toast.autovacuum_enabled = true,
> autovacuum_vacuum_threshold = 0,
> toast.autovacuum_vacuum_threshold = 0,
> autovacuum_vacuum_scale_factor = 0,
> toast.autovacuum_vacuum_scale_factor = 0,
> autovacuum_analyze_threshold = 0,
> autovacuum_analyze_scale_factor = 0);
> ```
>
> At the moment, my assumption is that the autovacuum is not working
> because the number of rows in the table does not change and remains
> zero. Any solution will suit me, for example, not to write rows to toast
> if their insertion failed. Or the proper setting of the autovacuum.
> Please tell me what can be done.
>

I'd create a cron entry that does a regular "vacuumdb -d the_db -t
controlzone_passage".  How often you run it depends on how quickly it
bloats.

-- 
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!

Reply via email to