/* * Fills in the relation statistics for an append-only relation. * * This information is used to update the reltuples and relpages information * in pg_class. reltuples is the same as "pg_aoseg_<oid>:tupcount" * column and we simulate relpages by subdividing the eof value * ("pg_aoseg_<oid>:eof") over the defined page size. */ void vacuum_appendonly_fill_stats(Relation aorel, Snapshot snapshot, BlockNumber *rel_pages, double *rel_tuples, bool *relhasindex) { FileSegTotals *fstotal; BlockNumber nblocks; char *relname; double num_tuples; double totalbytes; double eof; int64 hidden_tupcount; AppendOnlyVisimap visimap; Assert(RelationIsAoRows(aorel) || RelationIsAoCols(aorel)); relname = RelationGetRelationName(aorel); /* get updated statistics from the pg_aoseg table */ if (RelationIsAoRows(aorel)) { fstotal = GetSegFilesTotals(aorel, snapshot); } else { Assert(RelationIsAoCols(aorel)); fstotal = GetAOCSSSegFilesTotals(aorel, snapshot); } /* calculate the values we care about */ eof = (double)fstotal->totalbytes; num_tuples = (double)fstotal->totaltuples; totalbytes = eof; nblocks = (uint32)RelationGuessNumberOfBlocks(totalbytes); AppendOnlyVisimap_Init(&visimap, aorel->rd_appendonly->visimaprelid, aorel->rd_appendonly->visimapidxid, AccessShareLock, snapshot); hidden_tupcount = AppendOnlyVisimap_GetRelationHiddenTupleCount(&visimap); num_tuples -= hidden_tupcount; Assert(num_tuples > -1.0); AppendOnlyVisimap_Finish(&visimap, AccessShareLock); elogif (Debug_appendonly_print_compaction, LOG, "Gather statistics after vacuum for append-only relation %s: " "page count %d, tuple count %f", relname, nblocks, num_tuples); *rel_pages = nblocks; *rel_tuples = num_tuples; *relhasindex = aorel->rd_rel->relhasindex; ereport(elevel, (errmsg("\"%s\": found %.0f rows in %u pages.", relname, num_tuples, nblocks))); pfree(fstotal); }
static void gp_statistics_estimate_reltuples_relpages_ao_rows(Relation rel, float4 *reltuples, float4 *relpages) { FileSegTotals *fstotal; AppendOnlyEntry *aoEntry; AppendOnlyVisimap visimap; int64 hidden_tupcount = 0; /** * Ensure that the right kind of relation with the right type of storage is passed to us. */ Assert(rel->rd_rel->relkind == RELKIND_RELATION); Assert(RelationIsAoRows(rel)); fstotal = GetSegFilesTotals(rel, SnapshotNow); Assert(fstotal); /** * The planner doesn't understand AO's blocks, so need this method to try to fudge up a number for * the planner. */ *relpages = RelationGuessNumberOfBlocks((double)fstotal->totalbytes); aoEntry = GetAppendOnlyEntry(RelationGetRelid(rel), SnapshotNow); AppendOnlyVisimap_Init(&visimap, aoEntry->visimaprelid, aoEntry->visimapidxid, AccessShareLock, SnapshotNow); hidden_tupcount = AppendOnlyVisimap_GetRelationHiddenTupleCount(&visimap); AppendOnlyVisimap_Finish(&visimap, AccessShareLock); /** * The number of tuples in AO table is known accurately. Therefore, we just utilize this value. */ *reltuples = (double)(fstotal->totaltuples - hidden_tupcount); pfree(fstotal); pfree(aoEntry); return; }