diff options
author | Andres Freund <andres@anarazel.de> | 2018-03-28 13:26:51 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2018-03-28 13:26:51 -0700 |
commit | 1f0c6a9e7dca70ba7d2c949e42298d764ca457c0 (patch) | |
tree | af2beee3d82d023bfdc31527d98f109ba42d13d5 /src/backend/commands/explain.c | |
parent | 9370462e9a79755aea367c62eb0fef96f0c42258 (diff) | |
download | postgresql-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.c | 59 |
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 * |