static bool auto_explain_log_timing = true;
static int auto_explain_log_format = EXPLAIN_FORMAT_TEXT;
static bool auto_explain_log_nested_statements = false;
+static double auto_explain_sample_ratio = 1;
static const struct config_enum_entry format_options[] = {
{"text", EXPLAIN_FORMAT_TEXT, false},
static ExecutorFinish_hook_type prev_ExecutorFinish = NULL;
static ExecutorEnd_hook_type prev_ExecutorEnd = NULL;
+/* Is the current query sampled, per backend */
+static bool current_query_sampled = true;
+
#define auto_explain_enabled() \
(auto_explain_log_min_duration >= 0 && \
(nesting_level == 0 || auto_explain_log_nested_statements))
NULL,
NULL);
+ DefineCustomRealVariable("auto_explain.sample_ratio",
+ "Fraction of queries to process.",
+ NULL,
+ &auto_explain_sample_ratio,
+ 1.0,
+ 0.0,
+ 1.0,
+ PGC_SUSET,
+ 0,
+ NULL,
+ NULL,
+ NULL);
+
EmitWarningsOnPlaceholders("auto_explain");
/* Install hooks. */
static void
explain_ExecutorStart(QueryDesc *queryDesc, int eflags)
{
- if (auto_explain_enabled())
+ /*
+ * For ratio sampling, randomly choose top-level statement. Either
+ * all nested statements will be explained or none will.
+ */
+ if (auto_explain_log_min_duration >= 0 && nesting_level == 0)
+ current_query_sampled = (random() < auto_explain_sample_ratio *
+ MAX_RANDOM_VALUE);
+
+ if (auto_explain_enabled() && current_query_sampled)
{
/* Enable per-node instrumentation iff log_analyze is required. */
if (auto_explain_log_analyze && (eflags & EXEC_FLAG_EXPLAIN_ONLY) == 0)
else
standard_ExecutorStart(queryDesc, eflags);
- if (auto_explain_enabled())
+ if (auto_explain_enabled() && current_query_sampled)
{
/*
* Set up to track total elapsed time in ExecutorRun. Make sure the
static void
explain_ExecutorEnd(QueryDesc *queryDesc)
{
- if (queryDesc->totaltime && auto_explain_enabled())
+ if (queryDesc->totaltime && auto_explain_enabled() && current_query_sampled)
{
double msec;
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term>
+ <varname>auto_explain.sample_ratio</varname> (<type>real</type>)
+ <indexterm>
+ <primary><varname>auto_explain.sample_ratio</> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <varname>auto_explain.sample_ratio</varname> (<type>floating point</type>)
+ causes auto_explain to only explain a fraction of the statements in each
+ session. The default is 1, meaning explain all the queries. In case
+ of nested statements, either all will be explained or none. Only
+ superusers can change this setting.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>