Skip to content

Commit ea569d6

Browse files
committed
Add SETTINGS option to EXPLAIN, to print modified settings.
Query planning is affected by a number of configuration options, and it may be crucial to know which of those options were set to non-default values. With this patch you can say EXPLAIN (SETTINGS ON) to include that information in the query plan. Only options affecting planning, with values different from the built-in default are printed. This patch also adds auto_explain.log_settings option, providing the same capability in auto_explain module. Author: Tomas Vondra Reviewed-by: Rafia Sabih, John Naylor Discussion: https://postgr.es/m/e1791b4c-df9c-be02-edc5-7c8874944be0@2ndquadrant.com
1 parent d1f04b9 commit ea569d6

File tree

8 files changed

+333
-52
lines changed

8 files changed

+333
-52
lines changed

contrib/auto_explain/auto_explain.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ static bool auto_explain_log_verbose = false;
2828
static bool auto_explain_log_buffers = false;
2929
static bool auto_explain_log_triggers = false;
3030
static bool auto_explain_log_timing = true;
31+
static bool auto_explain_log_settings = false;
3132
static int auto_explain_log_format = EXPLAIN_FORMAT_TEXT;
3233
static int auto_explain_log_level = LOG;
3334
static bool auto_explain_log_nested_statements = false;
@@ -112,6 +113,17 @@ _PG_init(void)
112113
NULL,
113114
NULL);
114115

116+
DefineCustomBoolVariable("auto_explain.log_settings",
117+
"Log modified configuration parameters affecting query planning.",
118+
NULL,
119+
&auto_explain_log_settings,
120+
false,
121+
PGC_SUSET,
122+
0,
123+
NULL,
124+
NULL,
125+
NULL);
126+
115127
DefineCustomBoolVariable("auto_explain.log_verbose",
116128
"Use EXPLAIN VERBOSE for plan logging.",
117129
NULL,
@@ -356,6 +368,7 @@ explain_ExecutorEnd(QueryDesc *queryDesc)
356368
es->timing = (es->analyze && auto_explain_log_timing);
357369
es->summary = es->analyze;
358370
es->format = auto_explain_log_format;
371+
es->settings = auto_explain_log_settings;
359372

360373
ExplainBeginOutput(es);
361374
ExplainQueryText(es, queryDesc);

doc/src/sgml/auto-explain.sgml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,24 @@ LOAD 'auto_explain';
169169
</listitem>
170170
</varlistentry>
171171

172+
<varlistentry>
173+
<term>
174+
<varname>auto_explain.log_settings</varname> (<type>boolean</type>)
175+
<indexterm>
176+
<primary><varname>auto_explain.log_settings</varname> configuration parameter</primary>
177+
</indexterm>
178+
</term>
179+
<listitem>
180+
<para>
181+
<varname>auto_explain.log_settings</varname> controls whether information
182+
about modified configuration options are printed when execution plan is logged.
183+
Only options affecting query planning with value different from the built-in
184+
default value are included in the output. This parameter is off by default.
185+
Only superusers can change this setting.
186+
</para>
187+
</listitem>
188+
</varlistentry>
189+
172190
<varlistentry>
173191
<term>
174192
<varname>auto_explain.log_format</varname> (<type>enum</type>)

doc/src/sgml/ref/explain.sgml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ EXPLAIN [ ANALYZE ] [ VERBOSE ] <replaceable class="parameter">statement</replac
3939
ANALYZE [ <replaceable class="parameter">boolean</replaceable> ]
4040
VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
4141
COSTS [ <replaceable class="parameter">boolean</replaceable> ]
42+
SETTINGS [ <replaceable class="parameter">boolean</replaceable> ]
4243
BUFFERS [ <replaceable class="parameter">boolean</replaceable> ]
4344
TIMING [ <replaceable class="parameter">boolean</replaceable> ]
4445
SUMMARY [ <replaceable class="parameter">boolean</replaceable> ]
@@ -152,6 +153,17 @@ ROLLBACK;
152153
</listitem>
153154
</varlistentry>
154155

156+
<varlistentry>
157+
<term><literal>SETTINGS</literal></term>
158+
<listitem>
159+
<para>
160+
Include information on configuration parameters. Specifically, include
161+
options affecting query planning with value different from the built-in
162+
default value. This parameter defaults to <literal>FALSE</literal>.
163+
</para>
164+
</listitem>
165+
</varlistentry>
166+
155167
<varlistentry>
156168
<term><literal>BUFFERS</literal></term>
157169
<listitem>

src/backend/commands/explain.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "storage/bufmgr.h"
3030
#include "tcop/tcopprot.h"
3131
#include "utils/builtins.h"
32+
#include "utils/guc_tables.h"
3233
#include "utils/json.h"
3334
#include "utils/lsyscache.h"
3435
#include "utils/rel.h"
@@ -162,6 +163,8 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, const char *queryString,
162163
es->costs = defGetBoolean(opt);
163164
else if (strcmp(opt->defname, "buffers") == 0)
164165
es->buffers = defGetBoolean(opt);
166+
else if (strcmp(opt->defname, "settings") == 0)
167+
es->settings = defGetBoolean(opt);
165168
else if (strcmp(opt->defname, "timing") == 0)
166169
{
167170
timing_set = true;
@@ -596,6 +599,73 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
596599
ExplainCloseGroup("Query", NULL, true, es);
597600
}
598601

602+
/*
603+
* ExplainPrintSettings -
604+
* Print summary of modified settings affecting query planning.
605+
*/
606+
static void
607+
ExplainPrintSettings(ExplainState *es)
608+
{
609+
int num;
610+
struct config_generic **gucs;
611+
612+
/* bail out if information about settings not requested */
613+
if (!es->settings)
614+
return;
615+
616+
/* request an array of relevant settings */
617+
gucs = get_explain_guc_options(&num);
618+
619+
/* also bail out of there are no options */
620+
if (!num)
621+
return;
622+
623+
if (es->format != EXPLAIN_FORMAT_TEXT)
624+
{
625+
int i;
626+
627+
ExplainOpenGroup("Settings", "Settings", true, es);
628+
629+
for (i = 0; i < num; i++)
630+
{
631+
char *setting;
632+
struct config_generic *conf = gucs[i];
633+
634+
setting = GetConfigOptionByName(conf->name, NULL, true);
635+
636+
ExplainPropertyText(conf->name, setting, es);
637+
}
638+
639+
ExplainCloseGroup("Settings", "Settings", true, es);
640+
}
641+
else
642+
{
643+
int i;
644+
StringInfoData str;
645+
646+
initStringInfo(&str);
647+
648+
for (i = 0; i < num; i++)
649+
{
650+
char *setting;
651+
struct config_generic *conf = gucs[i];
652+
653+
if (i > 0)
654+
appendStringInfoString(&str, ", ");
655+
656+
setting = GetConfigOptionByName(conf->name, NULL, true);
657+
658+
if (setting)
659+
appendStringInfo(&str, "%s = '%s'", conf->name, setting);
660+
else
661+
appendStringInfo(&str, "%s = NULL", conf->name);
662+
}
663+
664+
if (num > 0)
665+
ExplainPropertyText("Settings", str.data, es);
666+
}
667+
}
668+
599669
/*
600670
* ExplainPrintPlan -
601671
* convert a QueryDesc's plan tree to text and append it to es->str
@@ -633,6 +703,12 @@ ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc)
633703
if (IsA(ps, GatherState) &&((Gather *) ps->plan)->invisible)
634704
ps = outerPlanState(ps);
635705
ExplainNode(ps, NIL, NULL, NULL, es);
706+
707+
/*
708+
* If requested, include information about GUC parameters with values
709+
* that don't match the built-in defaults.
710+
*/
711+
ExplainPrintSettings(es);
636712
}
637713

638714
/*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy