This is my first attempt at writing a patch, so it's pretty simple.
Commit log sums it up:
Adds a convenience feature to the explain command which prints out GUC cost
parameters in explain text output.
For example:
explain (params) select * from table;
will include text output like the following:
Cost Params:
seq_page: 1.000000, rnd_page: 4.000000, cpu_tup: 0.010000,
cpu_ind: 0.005000, cpu_op: 0.002500
amenabled: 11111111111
The bit vector is enable variables in the order listed in cost.h,
though mainly provides a high level view on whether or not any strategies
are disabled.
------
I recognize that this is kind of a frivolous feature which may not be worth
any potential maintenance burden, so submitted for what it's worth as an
initial effort.
Best Regards,
Robert
From 960dc64864306b554a2e150cb8e28e7a63f218d1 Mon Sep 17 00:00:00 2001
From: robert berry <[email protected]>
Date: Wed, 13 Nov 2013 15:29:23 -0800
Subject: [PATCH 1/1] Adds a convenience feature to the explain command which
prints out GUC cost parameters in explain text output.
For example:
will include text output like the following:
Cost Params:
seq_page: 1.000000, rnd_page: 4.000000, cpu_tup: 0.010000, cpu_ind: 0.005000, cpu_op: 0.002500
amenabled: 11111111111
The bit vector is enable variables in the order listed in cost.h, though mainly provides a high level
view on whether or not any strategies are disabled.
---
src/backend/commands/explain.c | 18 ++++++++++++++++++
src/include/commands/explain.h | 1 +
2 files changed, 19 insertions(+)
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 4e93df2..8feeca8 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -31,6 +31,7 @@
#include "utils/snapmgr.h"
#include "utils/tuplesort.h"
#include "utils/xml.h"
+#include "optimizer/cost.h"
/* Hook for plugins to get control in ExplainOneQuery() */
@@ -140,6 +141,8 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString,
es.costs = defGetBoolean(opt);
else if (strcmp(opt->defname, "buffers") == 0)
es.buffers = defGetBoolean(opt);
+ else if (strcmp(opt->defname, "params") == 0)
+ es.params = defGetBoolean(opt);
else if (strcmp(opt->defname, "timing") == 0)
{
timing_set = true;
@@ -516,6 +519,21 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
PopActiveSnapshot();
+ /* include one line display of cost parameters */
+ if (es->params)
+ {
+ if (es->format == EXPLAIN_FORMAT_TEXT)
+ {
+ appendStringInfo(es->str, "\nCost Params:\n");
+ appendStringInfo(es->str, "\tseq_page: %f, rnd_page: %f, cpu_tup: %f, cpu_ind: %f, cpu_op: %f",
+ seq_page_cost, random_page_cost, cpu_tuple_cost, cpu_index_tuple_cost, cpu_operator_cost, enable_seqscan);
+ appendStringInfo(es->str, "\n\tamenabled: %d%d%d%d%d%d%d%d%d%d%d\n\n",
+ enable_seqscan, enable_indexscan, enable_indexonlyscan, enable_bitmapscan,
+ enable_tidscan, enable_sort, enable_hashagg, enable_nestloop, enable_material,
+ enable_mergejoin, enable_hashjoin);
+ }
+ }
+
/* We need a CCI just in case query expanded to multiple plans */
if (es->analyze)
CommandCounterIncrement();
diff --git a/src/include/commands/explain.h b/src/include/commands/explain.h
index ca213d7..d76476c 100644
--- a/src/include/commands/explain.h
+++ b/src/include/commands/explain.h
@@ -33,6 +33,7 @@ typedef struct ExplainState
bool costs; /* print costs */
bool buffers; /* print buffer usage */
bool timing; /* print timing */
+ bool params; /* print optimizer cost params */
ExplainFormat format; /* output format */
/* other states */
PlannedStmt *pstmt; /* top of plan */
--
1.8.3.2
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers