Subject | Database size and garbage collection |
---|---|
Author | ed_heiberger |
Post date | 2005-09-14T20:24:59Z |
In message #64294, Ann W. Harrison wrote:
Why would my application ever try to read a record it has deleted?
Because, I have a similar problem where the database file grows
constantly. The application does a lot of record deletes. I'm
using the native Firebird C interfaces in my application.
I "fixed" the application by adding an SQL query after every 100
deletions. A simple query "select * from mytable" seems to do the
trick.
Although I have a workaround, I'd like to understand this issue
better, and I wonder if there is a better way?
Here's gstat output after a test run where the database grew through
out the test cycle. When I run the same test with the "fixed"
application, the database file grows to a fixed size and stays
there.
Database header page information:
Flags 0
Checksum 12345
Generation 50041
Page size 4096
ODS version 10.0
Oldest transaction 50036
Oldest active 50037
Oldest snapshot 50037
Next transaction 50038
Thanks.
>Gstat counts all records in the database, including those that areCan anyone help explain the "Even when this condition ..." part?
>marked as deleted but have not yet been removed. Records that are
>marked as deleted are not actually removed until after the end of all
>transactions that started before the delete was committed.
>
>Even when that condition is meet, the record is only garbage
>collected when some transaction tries to read it, so gstat may be
>counting records that are awaiting garbage collection.
Why would my application ever try to read a record it has deleted?
Because, I have a similar problem where the database file grows
constantly. The application does a lot of record deletes. I'm
using the native Firebird C interfaces in my application.
I "fixed" the application by adding an SQL query after every 100
deletions. A simple query "select * from mytable" seems to do the
trick.
Although I have a workaround, I'd like to understand this issue
better, and I wonder if there is a better way?
Here's gstat output after a test run where the database grew through
out the test cycle. When I run the same test with the "fixed"
application, the database file grows to a fixed size and stays
there.
Database header page information:
Flags 0
Checksum 12345
Generation 50041
Page size 4096
ODS version 10.0
Oldest transaction 50036
Oldest active 50037
Oldest snapshot 50037
Next transaction 50038
Thanks.