mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Include information on buffer usage during planning phase, in EXPLAIN output, take two.
When BUFFERS option is enabled, EXPLAIN command includes the information on buffer usage during each plan node, in its output. In addition to that, this commit makes EXPLAIN command include also the information on buffer usage during planning phase, in its output. This feature makes it easier to discern the cases where lots of buffer access happen during planning. This commit revives the original commited7a509571
that was reverted by commit19db23bcbd
. The original commit had to be reverted because it caused the regression test failure on the buildfarm members prion and dory. But since commitc0885c4c30
got rid of the caues of the test failure, the original commit can be safely introduced again. Author: Julien Rouhaud, slightly revised by Fujii Masao Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/16109-26a1a88651e90608@postgresql.org
This commit is contained in:
@ -372,7 +372,11 @@ ExplainOneQuery(Query *query, int cursorOptions,
|
||||
PlannedStmt *plan;
|
||||
instr_time planstart,
|
||||
planduration;
|
||||
BufferUsage bufusage_start,
|
||||
bufusage;
|
||||
|
||||
if (es->buffers)
|
||||
bufusage_start = pgBufferUsage;
|
||||
INSTR_TIME_SET_CURRENT(planstart);
|
||||
|
||||
/* plan the query */
|
||||
@ -381,9 +385,16 @@ ExplainOneQuery(Query *query, int cursorOptions,
|
||||
INSTR_TIME_SET_CURRENT(planduration);
|
||||
INSTR_TIME_SUBTRACT(planduration, planstart);
|
||||
|
||||
/* calc differences of buffer counters. */
|
||||
if (es->buffers)
|
||||
{
|
||||
memset(&bufusage, 0, sizeof(BufferUsage));
|
||||
BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start);
|
||||
}
|
||||
|
||||
/* run it (if needed) and produce output */
|
||||
ExplainOnePlan(plan, into, es, queryString, params, queryEnv,
|
||||
&planduration);
|
||||
&planduration, (es->buffers ? &bufusage : NULL));
|
||||
}
|
||||
}
|
||||
|
||||
@ -476,7 +487,8 @@ ExplainOneUtility(Node *utilityStmt, IntoClause *into, ExplainState *es,
|
||||
void
|
||||
ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
|
||||
const char *queryString, ParamListInfo params,
|
||||
QueryEnvironment *queryEnv, const instr_time *planduration)
|
||||
QueryEnvironment *queryEnv, const instr_time *planduration,
|
||||
const BufferUsage *bufusage)
|
||||
{
|
||||
DestReceiver *dest;
|
||||
QueryDesc *queryDesc;
|
||||
@ -560,6 +572,9 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
|
||||
/* Create textual dump of plan tree */
|
||||
ExplainPrintPlan(es, queryDesc);
|
||||
|
||||
if (es->summary && (planduration || bufusage))
|
||||
ExplainOpenGroup("Planning", "Planning", true, es);
|
||||
|
||||
if (es->summary && planduration)
|
||||
{
|
||||
double plantime = INSTR_TIME_GET_DOUBLE(*planduration);
|
||||
@ -567,6 +582,19 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
|
||||
ExplainPropertyFloat("Planning Time", "ms", 1000.0 * plantime, 3, es);
|
||||
}
|
||||
|
||||
/* Show buffer usage */
|
||||
if (es->summary && bufusage)
|
||||
{
|
||||
if (es->format == EXPLAIN_FORMAT_TEXT)
|
||||
es->indent++;
|
||||
show_buffer_usage(es, bufusage);
|
||||
if (es->format == EXPLAIN_FORMAT_TEXT)
|
||||
es->indent--;
|
||||
}
|
||||
|
||||
if (es->summary && (planduration || bufusage))
|
||||
ExplainCloseGroup("Planning", "Planning", true, es);
|
||||
|
||||
/* Print info about runtime of triggers */
|
||||
if (es->analyze)
|
||||
ExplainPrintTriggers(es, queryDesc);
|
||||
|
Reference in New Issue
Block a user