title: Version compatibility

description: Feature matrix and version-specific behavior for PostgreSQL 16, 17, and 18

pg_stat_ch supports PostgreSQL 16, 17, and 18. All versions capture core telemetry. Newer versions expose additional metrics.

Feature matrix

Feature PG 16 PG 17 PG 18
Core metrics
Query timing (duration_us) Yes Yes Yes
Row counts Yes Yes Yes
Query ID Yes Yes Yes
Command type (SELECT/INSERT/UPDATE/DELETE/MERGE/UTILITY) Yes Yes Yes
Normalized query text Yes Yes Yes
Buffer usage
Shared blocks (hit/read/dirtied/written) Yes Yes Yes
Local blocks (hit/read/dirtied/written) Yes Yes Yes
Temp blocks (read/written) Yes Yes Yes
I/O timing
Shared block read/write time Yes Yes Yes
Local block read/write time Yes Yes
Temp block read/write time Yes Yes Yes
WAL
WAL records/FPI/bytes Yes Yes Yes
CPU time
User/system CPU time (getrusage) Yes Yes Yes
JIT
JIT function count and compilation times Yes Yes Yes
JIT deform time Yes Yes
Parallel query
Workers planned/launched Yes
Client context
Application name, client IP Yes Yes Yes
Error capture
SQLSTATE code, error level, message Yes Yes Yes
Observability
Custom wait event in pg_stat_activity Yes Yes

PostgreSQL 18

Parallel worker statistics

Fields: parallel_workers_planned, parallel_workers_launched

Tracks how many parallel workers the optimizer planned vs how many were actually launched. If launched < planned, the system may be hitting max_parallel_workers limits.

SELECT query_id, cmd_type,
       parallel_workers_planned,
       parallel_workers_launched,
       parallel_workers_planned - parallel_workers_launched AS workers_missed
FROM pg_stat_ch.events_raw
WHERE parallel_workers_planned > parallel_workers_launched
ORDER BY workers_missed DESC;

PostgreSQL 17

Separate local block I/O timing

Fields: local_blk_read_time_us, local_blk_write_time_us

PG 16 only tracked I/O timing for shared buffers. PG 17 adds separate timing for local buffers (temporary tables), enabling analysis of temp table performance.

SELECT query_id,
       local_blk_read_time_us + local_blk_write_time_us AS local_io_us,
       shared_blk_read_time_us + shared_blk_write_time_us AS shared_io_us
FROM pg_stat_ch.events_raw
WHERE local_blk_read_time_us > 0 OR local_blk_write_time_us > 0;

JIT deform time

Field: jit_deform_time_us

Time spent JIT-compiling tuple deform functions. High deform time may indicate queries touching many columns.

SELECT query_id, jit_functions, jit_deform_time_us,
       jit_generation_time_us + jit_inlining_time_us +
       jit_optimization_time_us + jit_emission_time_us AS other_jit_us
FROM pg_stat_ch.events_raw
WHERE jit_deform_time_us > 1000;  -- > 1ms

Custom wait event name

The background worker appears as PgStatChExporter in pg_stat_activity.wait_event instead of generic Extension. This makes it easier to identify pg_stat_ch activity in monitoring tools.

Field reference

For the complete list of all fields with types, descriptions, and tuning guidance, see the events schema reference.