diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/executor/nodeAgg.c | 2 | ||||
-rw-r--r-- | src/backend/optimizer/path/costsize.c | 30 |
2 files changed, 16 insertions, 16 deletions
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 2a6f44a6274..4c8c5cfc07a 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -1728,6 +1728,8 @@ hash_agg_set_limits(double hashentrysize, uint64 input_groups, int used_bits, /* if not expected to spill, use all of work_mem */ if (input_groups * hashentrysize < work_mem * 1024L) { + if (num_partitions != NULL) + *num_partitions = 0; *mem_limit = work_mem * 1024L; *ngroups_limit = *mem_limit / hashentrysize; return; diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 8cf694b61dc..9e7e57f118f 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -2257,6 +2257,7 @@ cost_agg(Path *path, PlannerInfo *root, */ if (aggstrategy == AGG_HASHED || aggstrategy == AGG_MIXED) { + double pages; double pages_written = 0.0; double pages_read = 0.0; double hashentrysize; @@ -2264,7 +2265,7 @@ cost_agg(Path *path, PlannerInfo *root, Size mem_limit; uint64 ngroups_limit; int num_partitions; - + int depth; /* * Estimate number of batches based on the computed limits. If less @@ -2279,25 +2280,22 @@ cost_agg(Path *path, PlannerInfo *root, nbatches = Max( (numGroups * hashentrysize) / mem_limit, numGroups / ngroups_limit ); + nbatches = Max(ceil(nbatches), 1.0); + num_partitions = Max(num_partitions, 2); + + /* + * The number of partitions can change at different levels of + * recursion; but for the purposes of this calculation assume it stays + * constant. + */ + depth = ceil( log(nbatches) / log(num_partitions) ); + /* * Estimate number of pages read and written. For each level of * recursion, a tuple must be written and then later read. */ - if (nbatches > 1.0) - { - double depth; - double pages; - - pages = relation_byte_size(input_tuples, input_width) / BLCKSZ; - - /* - * The number of partitions can change at different levels of - * recursion; but for the purposes of this calculation assume it - * stays constant. - */ - depth = ceil( log(nbatches - 1) / log(num_partitions) ); - pages_written = pages_read = pages * depth; - } + pages = relation_byte_size(input_tuples, input_width) / BLCKSZ; + pages_written = pages_read = pages * depth; startup_cost += pages_written * random_page_cost; total_cost += pages_written * random_page_cost; |