diff --git a/src/backend/statistics/mvdistinct.c b/src/backend/statistics/mvdistinct.c index 4b4ecec9361..bf63f2b9a73 100644 --- a/src/backend/statistics/mvdistinct.c +++ b/src/backend/statistics/mvdistinct.c @@ -33,6 +33,7 @@ #include "statistics/statistics.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" +#include "utils/memutils.h" #include "utils/syscache.h" #include "utils/typcache.h" @@ -93,6 +94,7 @@ statext_ndistinct_build(double totalrows, StatsBuildData *data) int itemcnt; int numattrs = data->nattnums; int numcombs = num_combinations(numattrs); + MemoryContext cxt; result = palloc(offsetof(MVNDistinct, items) + numcombs * sizeof(MVNDistinctItem)); @@ -100,6 +102,10 @@ statext_ndistinct_build(double totalrows, StatsBuildData *data) result->type = STATS_NDISTINCT_TYPE_BASIC; result->nitems = numcombs; + cxt = AllocSetContextCreate(CurrentMemoryContext, + "ndistinct_for_combination cxt", + ALLOCSET_DEFAULT_SIZES); + itemcnt = 0; for (k = 2; k <= numattrs; k++) { @@ -113,6 +119,7 @@ statext_ndistinct_build(double totalrows, StatsBuildData *data) { MVNDistinctItem *item = &result->items[itemcnt]; int j; + MemoryContext oldcxt; item->attributes = palloc(sizeof(AttrNumber) * k); item->nattributes = k; @@ -125,8 +132,12 @@ statext_ndistinct_build(double totalrows, StatsBuildData *data) Assert(AttributeNumberIsValid(item->attributes[j])); } + /* release memory used by ndistinct calculation */ + oldcxt = MemoryContextSwitchTo(cxt); item->ndistinct = ndistinct_for_combination(totalrows, data, k, combination); + MemoryContextSwitchTo(oldcxt); + MemoryContextReset(cxt); itemcnt++; Assert(itemcnt <= result->nitems); @@ -135,6 +146,8 @@ statext_ndistinct_build(double totalrows, StatsBuildData *data) generator_free(generator); } + MemoryContextDelete(cxt); + /* must consume exactly the whole output array */ Assert(itemcnt == result->nitems);