Parameter · Resource Usage / I/O
effective_io_concurrency
Number of simultaneous requests that can be handled efficiently by the disk subsystem. 0 disables simultaneous requests.
- Default:
16 - Type: integer
- Range: 0 … 1000
- Applies: Session (any user)
In plain words
Modern disks, SSDs and cloud volumes can serve many requests at the same time. When PostgreSQL knows which blocks it will need next, it can ask for several in advance instead of waiting for each one. This setting is how far ahead it may go, i.e. how many reads a single session keeps in flight.
For DBAs and operators
Default changed from 1 to 16 in PostgreSQL 18, which introduced asynchronous I/O (io_method). It now controls the look-ahead distance of the read stream machinery used by sequential scans, bitmap heap scans, and other streaming reads; before PostgreSQL 17 it was used mainly for bitmap heap scan prefetching via posix_fadvise. 0 disables issuing asynchronous requests.
Sizing: for local NVMe and cloud block storage (EBS, Persistent Disk, Azure) values of 32–256 often help large scans, especially with high per-request latency. Spinning disks: low single digits. Too high adds latency for other sessions and wastes I/O if the scan stops early (LIMIT). Can be set per tablespace: ALTER TABLESPACE fast SET (effective_io_concurrency = 128).
-- watch I/Os in flight (PG18):
SELECT pid, operation, state, length, target_desc FROM pg_aios;
EXPLAIN (ANALYZE, BUFFERS) SELECT ... -- compare timingsThe actual number in flight is also capped by io_max_concurrency, and for maintenance work maintenance_io_concurrency is used instead.
How to change it
Any user can change it for their session with SET.
See it in context
Related parameters
maintenance_io_concurrency io_method io_max_concurrency io_combine_limit random_page_cost