| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * instrument.h |
| 4 | * definitions for run-time statistics collection |
| 5 | * |
| 6 | * |
| 7 | * Copyright (c) 2001-2019, PostgreSQL Global Development Group |
| 8 | * |
| 9 | * src/include/executor/instrument.h |
| 10 | * |
| 11 | *------------------------------------------------------------------------- |
| 12 | */ |
| 13 | #ifndef INSTRUMENT_H |
| 14 | #define INSTRUMENT_H |
| 15 | |
| 16 | #include "portability/instr_time.h" |
| 17 | |
| 18 | |
| 19 | typedef struct BufferUsage |
| 20 | { |
| 21 | long shared_blks_hit; /* # of shared buffer hits */ |
| 22 | long shared_blks_read; /* # of shared disk blocks read */ |
| 23 | long shared_blks_dirtied; /* # of shared blocks dirtied */ |
| 24 | long shared_blks_written; /* # of shared disk blocks written */ |
| 25 | long local_blks_hit; /* # of local buffer hits */ |
| 26 | long local_blks_read; /* # of local disk blocks read */ |
| 27 | long local_blks_dirtied; /* # of shared blocks dirtied */ |
| 28 | long local_blks_written; /* # of local disk blocks written */ |
| 29 | long temp_blks_read; /* # of temp blocks read */ |
| 30 | long temp_blks_written; /* # of temp blocks written */ |
| 31 | instr_time blk_read_time; /* time spent reading */ |
| 32 | instr_time blk_write_time; /* time spent writing */ |
| 33 | } BufferUsage; |
| 34 | |
| 35 | /* Flag bits included in InstrAlloc's instrument_options bitmask */ |
| 36 | typedef enum InstrumentOption |
| 37 | { |
| 38 | INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */ |
| 39 | INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */ |
| 40 | INSTRUMENT_ROWS = 1 << 2, /* needs row count */ |
| 41 | INSTRUMENT_ALL = PG_INT32_MAX |
| 42 | } InstrumentOption; |
| 43 | |
| 44 | typedef struct Instrumentation |
| 45 | { |
| 46 | /* Parameters set at node creation: */ |
| 47 | bool need_timer; /* true if we need timer data */ |
| 48 | bool need_bufusage; /* true if we need buffer usage data */ |
| 49 | /* Info about current plan cycle: */ |
| 50 | bool running; /* true if we've completed first tuple */ |
| 51 | instr_time starttime; /* Start time of current iteration of node */ |
| 52 | instr_time counter; /* Accumulated runtime for this node */ |
| 53 | double firsttuple; /* Time for first tuple of this cycle */ |
| 54 | double tuplecount; /* Tuples emitted so far this cycle */ |
| 55 | BufferUsage bufusage_start; /* Buffer usage at start */ |
| 56 | /* Accumulated statistics across all completed cycles: */ |
| 57 | double startup; /* Total startup time (in seconds) */ |
| 58 | double total; /* Total total time (in seconds) */ |
| 59 | double ntuples; /* Total tuples produced */ |
| 60 | double ntuples2; /* Secondary node-specific tuple counter */ |
| 61 | double nloops; /* # of run cycles for this node */ |
| 62 | double nfiltered1; /* # tuples removed by scanqual or joinqual */ |
| 63 | double nfiltered2; /* # tuples removed by "other" quals */ |
| 64 | BufferUsage bufusage; /* Total buffer usage */ |
| 65 | } Instrumentation; |
| 66 | |
| 67 | typedef struct WorkerInstrumentation |
| 68 | { |
| 69 | int num_workers; /* # of structures that follow */ |
| 70 | Instrumentation instrument[FLEXIBLE_ARRAY_MEMBER]; |
| 71 | } WorkerInstrumentation; |
| 72 | |
| 73 | extern PGDLLIMPORT BufferUsage pgBufferUsage; |
| 74 | |
| 75 | extern Instrumentation *InstrAlloc(int n, int instrument_options); |
| 76 | extern void InstrInit(Instrumentation *instr, int instrument_options); |
| 77 | extern void InstrStartNode(Instrumentation *instr); |
| 78 | extern void InstrStopNode(Instrumentation *instr, double nTuples); |
| 79 | extern void InstrEndLoop(Instrumentation *instr); |
| 80 | extern void InstrAggNode(Instrumentation *dst, Instrumentation *add); |
| 81 | extern void InstrStartParallelQuery(void); |
| 82 | extern void InstrEndParallelQuery(BufferUsage *result); |
| 83 | extern void InstrAccumParallelQuery(BufferUsage *result); |
| 84 | |
| 85 | #endif /* INSTRUMENT_H */ |
| 86 | |