aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/explain.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-03-28 13:26:51 -0700
committerAndres Freund <andres@anarazel.de>2018-03-28 13:26:51 -0700
commit1f0c6a9e7dca70ba7d2c949e42298d764ca457c0 (patch)
treeaf2beee3d82d023bfdc31527d98f109ba42d13d5 /src/backend/commands/explain.c
parent9370462e9a79755aea367c62eb0fef96f0c42258 (diff)
downloadpostgresql-1f0c6a9e7dca70ba7d2c949e42298d764ca457c0.tar.gz
postgresql-1f0c6a9e7dca70ba7d2c949e42298d764ca457c0.zip
Add EXPLAIN support for JIT.
This just shows a few details about JITing, e.g. how many functions have been JITed, and how long that took. To avoid noise in regression tests with functions sometimes being JITed in --with-llvm builds, disable display when COSTS OFF is specified. Author: Andres Freund Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r--src/backend/commands/explain.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index c38d178cd9f..8a58672a94e 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -21,6 +21,7 @@
#include "commands/prepare.h"
#include "executor/nodeHash.h"
#include "foreign/fdwapi.h"
+#include "jit/jit.h"
#include "nodes/extensible.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/clauses.h"
@@ -557,6 +558,16 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
ExplainPrintTriggers(es, queryDesc);
/*
+ * Print info about JITing. Tied to es->costs because we don't want to
+ * display this in regression tests, as it'd cause output differences
+ * depending on build options. Might want to separate that out from COSTS
+ * at a later stage.
+ */
+ if (queryDesc->estate->es_jit && es->costs &&
+ queryDesc->estate->es_jit->created_functions > 0)
+ ExplainPrintJIT(es, queryDesc);
+
+ /*
* Close down the query and free resources. Include time for this in the
* total execution time (although it should be pretty minimal).
*/
@@ -678,6 +689,54 @@ ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc)
}
/*
+ * ExplainPrintJIT -
+ * Append information about JITing to es->str.
+ */
+void
+ExplainPrintJIT(ExplainState *es, QueryDesc *queryDesc)
+{
+ JitContext *jc = queryDesc->estate->es_jit;
+
+ ExplainOpenGroup("JIT", "JIT", true, es);
+
+ if (es->format == EXPLAIN_FORMAT_TEXT)
+ {
+ es->indent += 1;
+ appendStringInfo(es->str, "JIT:\n");
+ }
+
+ ExplainPropertyInteger("Functions", NULL, jc->created_functions, es);
+ if (es->analyze && es->timing)
+ ExplainPropertyFloat("Generation Time", "ms",
+ 1000.0 * INSTR_TIME_GET_DOUBLE(jc->generation_counter),
+ 3, es);
+
+ ExplainPropertyBool("Inlining", jc->flags & PGJIT_INLINE, es);
+
+ if (es->analyze && es->timing)
+ ExplainPropertyFloat("Inlining Time", "ms",
+ 1000.0 * INSTR_TIME_GET_DOUBLE(jc->inlining_counter),
+ 3, es);
+
+ ExplainPropertyBool("Optimization", jc->flags & PGJIT_OPT3, es);
+ if (es->analyze && es->timing)
+ ExplainPropertyFloat("Optimization Time", "ms",
+ 1000.0 * INSTR_TIME_GET_DOUBLE(jc->optimization_counter),
+ 3, es);
+
+ if (es->analyze && es->timing)
+ ExplainPropertyFloat("Emission Time", "ms",
+ 1000.0 * INSTR_TIME_GET_DOUBLE(jc->emission_counter),
+ 3, es);
+
+ ExplainCloseGroup("JIT", "JIT", true, es);
+ if (es->format == EXPLAIN_FORMAT_TEXT)
+ {
+ es->indent -= 1;
+ }
+}
+
+/*
* ExplainQueryText -
* add a "Query Text" node that contains the actual text of the query
*