diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-06-06 22:13:52 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-06-06 22:13:52 +0000 |
commit | 32ea236361ebedbb27b52a865d017b2858203812 (patch) | |
tree | bdecc221c3a5680b03adf19e26beaf098036fe63 /src/backend/access/gist/gistvacuum.c | |
parent | 4334695b3026b23b1aeff3275536401335536ec9 (diff) | |
download | postgresql-32ea236361ebedbb27b52a865d017b2858203812.tar.gz postgresql-32ea236361ebedbb27b52a865d017b2858203812.zip |
Improve the IndexVacuumInfo/IndexBulkDeleteResult API to allow somewhat sane
behavior in cases where we don't know the heap tuple count accurately; in
particular partial vacuum, but this also makes the API a bit more useful
for ANALYZE. This patch adds "estimated_count" flags to both structs so
that an approximate count can be flagged as such, and adjusts the logic
so that approximate counts are not used for updating pg_class.reltuples.
This fixes my previous complaint that VACUUM was putting ridiculous values
into pg_class.reltuples for indexes. The actual impact of that bug is
limited, because the planner only pays attention to reltuples for an index
if the index is partial; which probably explains why beta testers hadn't
noticed a degradation in plan quality from it. But it needs to be fixed.
The whole thing is a bit messy and should be redesigned in future, because
reltuples now has the potential to drift quite far away from reality when
a long period elapses with no non-partial vacuums. But this is as good as
it's going to get for 8.4.
Diffstat (limited to 'src/backend/access/gist/gistvacuum.c')
-rw-r--r-- | src/backend/access/gist/gistvacuum.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index 01b8512d070..833e6c574eb 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.43 2009/03/24 20:17:11 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.44 2009/06/06 22:13:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -524,8 +524,8 @@ gistvacuumcleanup(PG_FUNCTION_ARGS) { stats = (GistBulkDeleteResult *) palloc0(sizeof(GistBulkDeleteResult)); /* use heap's tuple count */ - Assert(info->num_heap_tuples >= 0); stats->std.num_index_tuples = info->num_heap_tuples; + stats->std.estimated_count = info->estimated_count; /* * XXX the above is wrong if index is partial. Would it be OK to just @@ -679,6 +679,7 @@ gistbulkdelete(PG_FUNCTION_ARGS) if (stats == NULL) stats = (GistBulkDeleteResult *) palloc0(sizeof(GistBulkDeleteResult)); /* we'll re-count the tuples each time */ + stats->std.estimated_count = false; stats->std.num_index_tuples = 0; stack = (GistBDItem *) palloc0(sizeof(GistBDItem)); |