From 9374b365f10d3ecb1250b580c1700f2415f9c4df Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Mon, 5 Feb 2018 13:50:45 +1300
Subject: [PATCH] Skip setting up shared instrumentation for Hash node if not
 needed.

We don't need to set up the shared space for hash join instrumentation data if
instrumentation hasn't been requested.  Let's follow the example of the
similar Sort node code and save a few cycles by skipping that when we can.

Thomas Munro, following complaint from Tom Lane about a nearby bug
Discussion: https://postgr.es/m/E1ehkoZ-0005uW-43%40gemulon.postgresql.org
---
 src/backend/executor/nodeHash.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index 70553b8fdf..b10f847452 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -2549,6 +2549,10 @@ ExecHashEstimate(HashState *node, ParallelContext *pcxt)
 {
 	size_t		size;
 
+	/* don't need this if not instrumenting or no workers */
+	if (!node->ps.instrument || pcxt->nworkers == 0)
+		return;
+
 	size = mul_size(pcxt->nworkers, sizeof(HashInstrumentation));
 	size = add_size(size, offsetof(SharedHashInfo, hinstrument));
 	shm_toc_estimate_chunk(&pcxt->estimator, size);
@@ -2564,6 +2568,10 @@ ExecHashInitializeDSM(HashState *node, ParallelContext *pcxt)
 {
 	size_t		size;
 
+	/* don't need this if not instrumenting or no workers */
+	if (!node->ps.instrument || pcxt->nworkers == 0)
+		return;
+
 	size = offsetof(SharedHashInfo, hinstrument) +
 		pcxt->nworkers * sizeof(HashInstrumentation);
 	node->shared_info = (SharedHashInfo *) shm_toc_allocate(pcxt->toc, size);
@@ -2582,13 +2590,13 @@ ExecHashInitializeWorker(HashState *node, ParallelWorkerContext *pwcxt)
 {
 	SharedHashInfo *shared_info;
 
-	/* might not be there ... */
+	/* don't need this if not instrumenting */
+	if (!node->ps.instrument)
+		return;
+
 	shared_info = (SharedHashInfo *)
-		shm_toc_lookup(pwcxt->toc, node->ps.plan->plan_node_id, true);
-	if (shared_info)
-		node->hinstrument = &shared_info->hinstrument[ParallelWorkerNumber];
-	else
-		node->hinstrument = NULL;
+		shm_toc_lookup(pwcxt->toc, node->ps.plan->plan_node_id, false);
+	node->hinstrument = &shared_info->hinstrument[ParallelWorkerNumber];
 }
 
 /*
@@ -2614,6 +2622,9 @@ ExecHashRetrieveInstrumentation(HashState *node)
 	SharedHashInfo *shared_info = node->shared_info;
 	size_t		size;
 
+	if (shared_info == NULL)
+		return;
+
 	/* Replace node->shared_info with a copy in backend-local memory. */
 	size = offsetof(SharedHashInfo, hinstrument) +
 		shared_info->num_workers * sizeof(HashInstrumentation);
-- 
2.15.1

