oakoss/agent-skills
postgres-tuning
PostgreSQL 17/18+ performance tuning and optimization. Covers async I/O configuration, query plan forensics, index strategies, autovacuum tuning, vector search optimization, connection pooling, declarative partitioning, and practical query patterns. Use when diagnosing slow queries, configuring async I/O, tuning autovacuum, optimizing vector indexes, analyzing execution plans with EXPLAIN BUFFERS…
Agent workflows
Databases
Use judgment
Installs
95
Stars
15
Security
No audit
Freshness
Unknown
Updated
—
First seen Feb 20, 2026
Installation
Project
Global
Entire repo
Entire repo (global)
$
npx skills add oakoss/agent-skills --skill postgres-tuning
Copy
SKILL.md
PostgreSQL Tuning
Overview
Optimizes PostgreSQL 17/18+ performance across I/O, query execution, indexing, and maintenance. Covers the native AIO subsystem introduced in PostgreSQL 18 for throughput gains on modern storage, forensic query plan analysis with EXPLAIN BUFFERS (auto-included in PG18), B-tree skip scans for composite indexes, native UUIDv7 generation, and autovacuum tuning for high-churn tables.
When to use: Diagnosing slow queries, configuring async I/O, tuning sharedbuffers and work mem, optimizing indexes for write-heavy workloads, managing table bloat, pgvector HNSW tuning.
When NOT to use: Schema design (use a data modeling tool), application-level caching strategy, database selection decisions, ORM query generation.
Key monitoring views:
pgstat statements — identifies slow query patterns by cumulative execution time
pgstat io — granular I/O analysis by backend type, object, and context (PG16+)
pgstat checkpointer — checkpoint frequency and timing (PG17+; previously in pgstat bgwriter)
pgstat user_tables — dead tuple counts for bloat detection and autovacuum monitoring
pgstatio user_tables — buffer cache hit ratios per table
pg_aios — in-progress AIO operations (PG18+)
Quick Reference
Pattern
Configuration / Query
Key Points
Async I/O
iomethod = worker or iouring
PG18 default is worker; io_uring Linux-only (kernel 5.1+, requires liburing build flag)
I/O concurrency
iomax concurrency and io_workers
ioworkers defaults to 3; iomax_concurrency defaults to -1 (auto-calculated)
Forensic EXPLAIN
EXPLAIN (ANALYZE, BUFFERS, SETTINGS)
PG18 auto-includes BUFFERS with ANALYZE; target Shared Hit > 95%
UUIDv7 primary keys
DEFAULT uuidv7()
PG18 built-in; time-ordered, monotonic within a session; RFC 9562 compliant
B-tree skip scan
Composite index on (a, b)
PG18 skips leading column; works best with low-cardinality prefix and equality on trailing columns
Aggressive autovacuum
autovacuumvacuum scale_factor = 0.01
Triggers at 1% row change instead of default 20%
Shared buffers
Start at 25% of RAM
Do not exceed 40% without benchmarking
work_mem tuning
SET work_mem = '64MB' per session
Prevents sort spills to disk; allocated per operator, not per query
BRIN index
CREATE INDEX USING brin(...)
100x smaller than B-tree for physically ordered time-series data
HNSW vector index
USING hnsw (col vectorcosine ops)
Tune m (default 16) and ef_construction (default 64) for recall vs speed
GIN index
CREATE INDEX USING gin(...)
JSONB containment, full-text search, array operators; slower writes
Checkpoint tuning
checkpoint_timeout = 30min
Spread writes over 90% of timeout window to avoid I/O storms
WAL compression
wal_compression = zstd
Available since PG15; reduces WAL I/O 50-70% for write-heavy workloads
Bloat detection
pgstat usertables.n dead_tup
Reindex concurrently if bloat > 30%
I/O monitoring
SELECT * FROM pgstat io
Watch evictions (cache too small) and extends (fast growth)
Checkpoint monitoring
pgstat checkpointer
PG17+ moved checkpoint stats out of pgstat bgwriter
Key Version Changes
PostgreSQL 18:
Native async I/O via io_method parameter (reads only; writes remain synchronous)
Built-in uuidv7() function with monotonic ordering within a session (RFC 9562)
uuidv4() alias for genrandom uuid() and uuidextract timestamp() for UUIDv7
B-tree skip scan for composite indexes (equality on trailing columns, low-cardinality prefix)
EXPLAIN ANALYZE auto-includes buffer statistics without specifying BUFFERS
pgstat io gains byte-level columns (readbytes , writebytes, extendbytes ); opbytes removed
effectiveio concurrency default changed from 1 to 16
AIO monitoring via pg_aios system view for in-progress I/O operations
PostgreSQL 17:
Checkpoint statistics moved from pgstat bgwriter to pgstat checkpointer
Column renames: checkpointstimed to numtimed, checkpointsreq to numrequested
buffersbackend and buffersbackendfsync removed from pgstatbgwriter (now in pgstat_io)
PostgreSQL 15:
wal_compression expanded from boolean to support pglz, lz4, and zstd algorithms
Common Mistakes
Mistake
Correct Pattern
Using uuidgenerate v7() or genrandom uuid() for ordered keys
PG18 provides built-in uuidv7() for time-ordered UUIDs; pre-PG18 use pg_uuidv7 extension
Using maxasync ios as a configuration parameter
The correct PG18 parameter is iomax concurrency (max concurrent I/O ops per process)
Querying pgstat bgwriter for checkpoint statistics on PG17+
Checkpoint stats moved to pgstat checkpointer in PG17; columns renamed (numtimed , numrequested)
Using SELECT \* in high-frequency queries
Select only needed columns to reduce I/O and improve cache hit ratios
Ignoring sequential scans on tables over 10k rows
Add targeted indexes on columns used in WHERE, ORDER BY, and JOIN clauses
Setting shared_buffers above 40% of RAM without testing
Start at 25% and benchmark; excessive allocation causes OS page cache contention
Leaving autovacuum at default settings for high-churn tables
Tune autovacuumvacuum scale_factor to 0.01 for tables with frequent UPDATE/DELETE
Over-indexing columns rarely used in queries
Every extra index slows UPDATE/INSERT and prevents HOT (Heap Only Tuple) updates
Expecting B-tree skip scan to work with range predicates
PG18 skip scan only works with equality operators on trailing columns
Ignoring "External Merge Disk" in query plans
Increase work_mem for specific sessions; it indicates sort spills to disk
Setting iomethod = io uring without verifying build flags
PostgreSQL must be built with --with-liburing and requires Linux kernel 5.1+
Assuming PG18 AIO accelerates writes
AIO in PG18 only covers reads (seq scans, bitmap heap scans, VACUUM); writes remain synchronous
Tuning Workflow
Identify slow queries from pgstat statements (sort by totalexec time)
Analyze execution plans with EXPLAIN (ANALYZE, BUFFERS, SETTINGS)
Check buffer hit ratios via pgstatio user_tables (target > 99%)
Monitor I/O patterns via pgstat io (watch evictions and disk reads)
Optimize with targeted indexes, work_mem adjustments, or query rewrites
Verify improvements by re-running EXPLAIN and comparing costs
Maintain with aggressive autovacuum settings for high-churn tables
Delegation
Discover slow queries and I/O bottlenecks : Use Explore agent to analyze pgstat statements, pgstat io, and slow query logs
Execute query plan analysis and index optimization : Use Task agent to run EXPLAIN ANALYZE, create indexes, and verify performance improvements
Design database scaling and partitioning strategy : Use Plan agent to architect sharding, partitioning, and replication topology
References
[Async I/O configuration and storage tuning](references/aio-tuning.md)
[Query plan analysis and operator forensics](references/query-plan-analysis.md)
[Indexing strategies and bloat management](references/indexing-and-bloat.md)
[Connection pooling, partitioning, and query patterns](references/pooling-and-patterns.md)