diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index cf1cdcb..bd8c0ee 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -201,6 +201,7 @@ typedef enum * tape during a preread cycle (see discussion at top of file). */ #define MINORDER 6 /* minimum merge order */ +#define MAXORDER 250 /* maximum merge order */ #define TAPE_BUFFER_OVERHEAD (BLCKSZ * 3) #define MERGE_BUFFER_SIZE (BLCKSZ * 32) @@ -2066,8 +2067,15 @@ tuplesort_merge_order(int64 allowedMem) mOrder = (allowedMem - TAPE_BUFFER_OVERHEAD) / (MERGE_BUFFER_SIZE + TAPE_BUFFER_OVERHEAD); - /* Even in minimum memory, use at least a MINORDER merge */ + /* + * Even in minimum memory, use at least a MINORDER merge. At the same + * time, cap the maximum merge order quasi-arbitrarily. With more than + * several hundred tapes, the overhead per-tape is likely to become a + * concern, since that will only happen in the event of severe memory + * pressure. + */ mOrder = Max(mOrder, MINORDER); + mOrder = Min(mOrder, MAXORDER); return mOrder; }