mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Add an EXPLAIN (BUFFERS) option to show buffer-usage statistics.
This patch also removes buffer-usage statistics from the track_counts output, since this (or the global server statistics) is deemed to be a better interface to this information. Itagaki Takahiro, reviewed by Euler Taveira de Oliveira.
This commit is contained in:
@ -26,7 +26,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.337 2009/12/11 18:14:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.338 2009/12/15 04:57:47 rhaas Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -180,7 +180,7 @@ standard_ExecutorStart(QueryDesc *queryDesc, int eflags)
|
||||
*/
|
||||
estate->es_snapshot = RegisterSnapshot(queryDesc->snapshot);
|
||||
estate->es_crosscheck_snapshot = RegisterSnapshot(queryDesc->crosscheck_snapshot);
|
||||
estate->es_instrument = queryDesc->doInstrument;
|
||||
estate->es_instrument = queryDesc->instrument_options;
|
||||
|
||||
/*
|
||||
* Initialize the plan state tree
|
||||
@ -859,7 +859,7 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo,
|
||||
Relation resultRelationDesc,
|
||||
Index resultRelationIndex,
|
||||
CmdType operation,
|
||||
bool doInstrument)
|
||||
int instrument_options)
|
||||
{
|
||||
/*
|
||||
* Check valid relkind ... parser and/or planner should have noticed this
|
||||
@ -914,10 +914,8 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo,
|
||||
palloc0(n * sizeof(FmgrInfo));
|
||||
resultRelInfo->ri_TrigWhenExprs = (List **)
|
||||
palloc0(n * sizeof(List *));
|
||||
if (doInstrument)
|
||||
resultRelInfo->ri_TrigInstrument = InstrAlloc(n);
|
||||
else
|
||||
resultRelInfo->ri_TrigInstrument = NULL;
|
||||
if (instrument_options)
|
||||
resultRelInfo->ri_TrigInstrument = InstrAlloc(n, instrument_options);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -12,7 +12,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/executor/execProcnode.c,v 1.68 2009/10/12 18:10:41 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/executor/execProcnode.c,v 1.69 2009/12/15 04:57:47 rhaas Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -321,7 +321,7 @@ ExecInitNode(Plan *node, EState *estate, int eflags)
|
||||
|
||||
/* Set up instrumentation for this node if requested */
|
||||
if (estate->es_instrument)
|
||||
result->instrument = InstrAlloc(1);
|
||||
result->instrument = InstrAlloc(1, estate->es_instrument);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.137 2009/12/14 02:15:51 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.138 2009/12/15 04:57:47 rhaas Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -414,7 +414,7 @@ postquel_start(execution_state *es, SQLFunctionCachePtr fcache)
|
||||
fcache->src,
|
||||
snapshot, InvalidSnapshot,
|
||||
dest,
|
||||
fcache->paramLI, false);
|
||||
fcache->paramLI, 0);
|
||||
else
|
||||
es->qd = CreateUtilityQueryDesc(es->stmt,
|
||||
fcache->src,
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Copyright (c) 2001-2009, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/executor/instrument.c,v 1.22 2009/01/01 17:23:41 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/executor/instrument.c,v 1.23 2009/12/15 04:57:47 rhaas Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -17,14 +17,28 @@
|
||||
|
||||
#include "executor/instrument.h"
|
||||
|
||||
BufferUsage pgBufferUsage;
|
||||
|
||||
static void BufferUsageAccumDiff(BufferUsage *dst,
|
||||
const BufferUsage *add, const BufferUsage *sub);
|
||||
|
||||
/* Allocate new instrumentation structure(s) */
|
||||
Instrumentation *
|
||||
InstrAlloc(int n)
|
||||
InstrAlloc(int n, int instrument_options)
|
||||
{
|
||||
Instrumentation *instr = palloc0(n * sizeof(Instrumentation));
|
||||
Instrumentation *instr;
|
||||
|
||||
/* we don't need to do any initialization except zero 'em */
|
||||
/* timer is always required for now */
|
||||
Assert(instrument_options & INSTRUMENT_TIMER);
|
||||
|
||||
instr = palloc0(n * sizeof(Instrumentation));
|
||||
if (instrument_options & INSTRUMENT_BUFFERS)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
instr[i].needs_bufusage = true;
|
||||
}
|
||||
|
||||
return instr;
|
||||
}
|
||||
@ -37,6 +51,10 @@ InstrStartNode(Instrumentation *instr)
|
||||
INSTR_TIME_SET_CURRENT(instr->starttime);
|
||||
else
|
||||
elog(DEBUG2, "InstrStartNode called twice in a row");
|
||||
|
||||
/* initialize buffer usage per plan node */
|
||||
if (instr->needs_bufusage)
|
||||
instr->bufusage_start = pgBufferUsage;
|
||||
}
|
||||
|
||||
/* Exit from a plan node */
|
||||
@ -59,6 +77,11 @@ InstrStopNode(Instrumentation *instr, double nTuples)
|
||||
|
||||
INSTR_TIME_SET_ZERO(instr->starttime);
|
||||
|
||||
/* Adds delta of buffer usage to node's count. */
|
||||
if (instr->needs_bufusage)
|
||||
BufferUsageAccumDiff(&instr->bufusage,
|
||||
&pgBufferUsage, &instr->bufusage_start);
|
||||
|
||||
/* Is this the first tuple of this cycle? */
|
||||
if (!instr->running)
|
||||
{
|
||||
@ -95,3 +118,19 @@ InstrEndLoop(Instrumentation *instr)
|
||||
instr->firsttuple = 0;
|
||||
instr->tuplecount = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
BufferUsageAccumDiff(BufferUsage *dst,
|
||||
const BufferUsage *add,
|
||||
const BufferUsage *sub)
|
||||
{
|
||||
/* dst += add - sub */
|
||||
dst->shared_blks_hit += add->shared_blks_hit - sub->shared_blks_hit;
|
||||
dst->shared_blks_read += add->shared_blks_read - sub->shared_blks_read;
|
||||
dst->shared_blks_written += add->shared_blks_written - sub->shared_blks_written;
|
||||
dst->local_blks_hit += add->local_blks_hit - sub->local_blks_hit;
|
||||
dst->local_blks_read += add->local_blks_read - sub->local_blks_read;
|
||||
dst->local_blks_written += add->local_blks_written - sub->local_blks_written;
|
||||
dst->temp_blks_read += add->temp_blks_read - sub->temp_blks_read;
|
||||
dst->temp_blks_written += add->temp_blks_written - sub->temp_blks_written;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.211 2009/11/04 22:26:06 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.212 2009/12/15 04:57:47 rhaas Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1908,7 +1908,7 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI,
|
||||
plansource->query_string,
|
||||
snap, crosscheck_snapshot,
|
||||
dest,
|
||||
paramLI, false);
|
||||
paramLI, 0);
|
||||
res = _SPI_pquery(qdesc, fire_triggers,
|
||||
canSetTag ? tcount : 0);
|
||||
FreeQueryDesc(qdesc);
|
||||
|
Reference in New Issue
Block a user