Re: Bloated toast table with empty associated table
> It's the general principle that the _scale_factor defaults are in my > experience too high. Sorry, didn't mentioned Ok, thanks, I will use the cron task. It's toast behaviour still seems odd to me. Is there a way to prevent this behaviour at all, to not store rows which were failed to insert? On Thu, Mar 20, 2025 at 4:28 PM Ron Johnson wrote: > > On Thu, Mar 20, 2025 at 8:22 AM Paul Allen wrote: >> >> > Instantaneously and repeatedly, while ignoring the error? >> Yes, that's how it should work and I probably can't do anything about it. >> >> > Your _scale_factor values are too high. Drop them down to about 5%. >> >> Okay, but what about altering controlzone_passage table, where I set >> all _scale_factor >> values to 0? If this did not have an effect, then how will the value >> of 5% affect? Maybe I >> misunderstand, but the table does not change by any number of rows and >> its logical size >> remains zero. Anyway I will try it. > > > It's the general principle that the _scale_factor defaults are in my > experience too high. > > Like I said: "That's not the proximate cause, though" of this table's bloat. > >> >> > 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. >> >> Seems like it is the only solution for now. > > > The autovacuum daemon can't know/see everything. > >> >> On Thu, Mar 20, 2025 at 4:03 PM Ron Johnson wrote: >> > >> > On Thu, Mar 20, 2025 at 7:40 AM Paul Allen 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 2 >> >> autovacuum_max_workers 3 >> >> autovacuum_multixact_freeze_max_age 4 >> >> 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 , and butter sauce. >> > Don't boil me, I'm still alive. >> > lobster! > > > > -- > Death to , and butter sauce. > Don't boil me, I'm still alive. > lobster!
Re: Bloated toast table with empty associated table
> Instantaneously and repeatedly, while ignoring the error? Yes, that's how it should work and I probably can't do anything about it. > Your _scale_factor values are too high. Drop them down to about 5%. Okay, but what about altering controlzone_passage table, where I set all _scale_factor values to 0? If this did not have an effect, then how will the value of 5% affect? Maybe I misunderstand, but the table does not change by any number of rows and its logical size remains zero. Anyway I will try it. > 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. Seems like it is the only solution for now. On Thu, Mar 20, 2025 at 4:03 PM Ron Johnson wrote: > > On Thu, Mar 20, 2025 at 7:40 AM Paul Allen 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 2 >> autovacuum_max_workers 3 >> autovacuum_multixact_freeze_max_age 4 >> 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 , and butter sauce. > Don't boil me, I'm still alive. > lobster!
Bloated toast table with empty associated table
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 2 autovacuum_max_workers 3 autovacuum_multixact_freeze_max_age 4 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 ``` Problem. My backend application attempts unsuccessfully repeatedly to insert the same ~100 rows with images, 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. Thanks. Daniil Rozanov