public inbox for [email protected]
help / color / mirror / Atom feedFrom: Tatsuo Ishii <[email protected]>
Subject: [PATCH v1] Add memory/disk usage for WindowAgg nodes in EXPLAIN.
Date: Sat, 6 Jul 2024 19:48:30 +0900
---
src/backend/commands/explain.c | 37 ++++++++++++++++++++++++++++
src/backend/executor/nodeWindowAgg.c | 19 ++++++++++++++
src/include/nodes/execnodes.h | 2 ++
3 files changed, 58 insertions(+)
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 1e80fd8b68..177687ea80 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -126,6 +126,7 @@ static void show_incremental_sort_info(IncrementalSortState *incrsortstate,
ExplainState *es);
static void show_hash_info(HashState *hashstate, ExplainState *es);
static void show_material_info(MaterialState *mstate, ExplainState *es);
+static void show_windowagg_info(WindowAggState *winstate, ExplainState *es);
static void show_memoize_info(MemoizeState *mstate, List *ancestors,
ExplainState *es);
static void show_hashagg_info(AggState *aggstate, ExplainState *es);
@@ -2215,6 +2216,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
planstate, es);
show_upper_qual(((WindowAgg *) plan)->runConditionOrig,
"Run Condition", planstate, ancestors, es);
+ show_windowagg_info(castNode(WindowAggState, planstate), es);
break;
case T_Group:
show_group_keys(castNode(GroupState, planstate), ancestors, es);
@@ -3362,6 +3364,41 @@ show_material_info(MaterialState *mstate, ExplainState *es)
}
}
+/*
+ * Show information on WindowAgg node, storage method and maximum memory/disk
+ * space used.
+ */
+static void
+show_windowagg_info(WindowAggState *winstate, ExplainState *es)
+{
+ const char *storageType;
+ int64 spaceUsedKB;
+
+ /*
+ * Nothing to show if ANALYZE option wasn't used or if execution didn't
+ * get as far as creating the tuplestore.
+ */
+ if (!es->analyze || winstate->storageType == NULL)
+ return;
+
+ storageType = winstate->storageType;
+ spaceUsedKB = BYTES_TO_KILOBYTES(winstate->storageSize);
+
+ if (es->format != EXPLAIN_FORMAT_TEXT)
+ {
+ ExplainPropertyText("Storage", storageType, es);
+ ExplainPropertyInteger("Maximum Storage", "kB", spaceUsedKB, es);
+ }
+ else
+ {
+ ExplainIndentText(es);
+ appendStringInfo(es->str,
+ "Storage: %s Maximum Storage: " INT64_FORMAT "kB\n",
+ storageType,
+ spaceUsedKB);
+ }
+}
+
/*
* Show information on memoize hits/misses/evictions and memory usage.
*/
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 3221fa1522..bcfe144511 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1360,7 +1360,23 @@ release_partition(WindowAggState *winstate)
}
if (winstate->buffer)
+ {
+ int64 spaceUsed = tuplestore_space_used(winstate->buffer);
+
+ /*
+ * We want to track the max mem/disk usage so that we can use the info
+ * in EXPLAIN (ANALYZE).
+ */
+ if (spaceUsed > winstate->storageSize)
+ {
+ if (winstate->storageType != NULL)
+ pfree(winstate->storageType);
+ winstate->storageType =
+ pstrdup(tuplestore_storage_type_name(winstate->buffer));
+ winstate->storageSize = spaceUsed;
+ }
tuplestore_end(winstate->buffer);
+ }
winstate->buffer = NULL;
winstate->partition_spooled = false;
}
@@ -2671,6 +2687,9 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
winstate->partition_spooled = false;
winstate->more_partitions = false;
+ winstate->storageType = NULL;
+ winstate->storageSize = 0;
+
return winstate;
}
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index b62c96f206..7a3dfa2bc3 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2567,6 +2567,8 @@ typedef struct WindowAggState
ExprState *partEqfunction; /* equality funcs for partition columns */
ExprState *ordEqfunction; /* equality funcs for ordering columns */
Tuplestorestate *buffer; /* stores rows of current partition */
+ int64 storageSize; /* max storage size in buffer */
+ char *storageType; /* the storage type above */
int current_ptr; /* read pointer # for current row */
int framehead_ptr; /* read pointer # for frame head, if used */
int frametail_ptr; /* read pointer # for frame tail, if used */
--
2.25.1
----Next_Part(Sat_Jul__6_20_22_54_2024_404)----
view thread (4+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v1] Add memory/disk usage for WindowAgg nodes in EXPLAIN.
In-Reply-To: <no-message-id-1839313@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox