Iron Law
NEVER TUNE WHAT YOU HAVEN'T MEASURED — CHECK pg_stat_statements AND pg_stat_activity BEFORE CHANGING CONFIGURATION OR ADDING INDEXES
When to Use This Skill
- Configuring connection pooling (PgBouncer, Prisma pool, asyncpg pool, R2DBC pool)
- Implementing Row Level Security (RLS) for multi-tenant data isolation
- Designing worker queues with
SKIP LOCKEDand advisory locks - Preventing deadlocks in concurrent write workloads
- Configuring VACUUM/ANALYZE and autovacuum tuning
- Adding full-text search with
tsvector/tsquery - Indexing JSONB columns (
jsonb_opsvsjsonb_path_ops) - Reviewing any PostgreSQL schema or query against the 8-category rule library
Do Not Use This Skill When
- You need query EXPLAIN analysis and index pattern SQL (use
sql-optimization-patterns) - You need schema migration design or ERDs (use
database-schema-designer) - You need cloud analytics or HTAP (use
sql-pro)
Rule Categories by Priority
| Priority | Category | Impact | Rules |
|---|---|---|---|
| 1 | Query Performance | CRITICAL | rules/query-*.md (5 rules) |
| 2 | Connection Management | CRITICAL | rules/conn-*.md (4 rules) |
| 3 | Security & RLS | CRITICAL | rules/security-*.md (3 rules) |
| 4 | Schema Design | HIGH | rules/schema-*.md (6 rules) |
| 5 | Concurrency & Locking | MEDIUM-HIGH | rules/lock-*.md (4 rules) |
| 6 | Data Access Patterns | MEDIUM | rules/data-*.md (4 rules) |
| 7 | Monitoring & Diagnostics | LOW-MEDIUM | rules/monitor-*.md (3 rules) |
| 8 | Advanced Features | LOW | rules/advanced-*.md (2 rules) |
Quick Rule Index
Connection Management (NEW — not in other skills)
rules/conn-pooling.md— PgBouncer setup, pool size formula(cores × 2) + spindles, transaction vs session moderules/conn-limits.md—max_connectionscalculation, prevent database OOM crashrules/conn-idle-timeout.md— Reclaim 30-50% idle connection slotsrules/conn-prepared-statements.md— Prepared statement conflicts in transaction-mode pooling
Concurrency & Locking (NEW — not in other skills)
rules/lock-skip-locked.md— Atomic claim-and-update queue pattern, 10x worker throughputrules/lock-deadlock-prevention.md— Consistent lock ordering, deadlock prevention patternsrules/lock-short-transactions.md— Minimize transaction duration, 3-5x throughputrules/lock-advisory.md— Application-level coordination without row-level locks
Security & RLS (NEW depth — not in other skills)
rules/security-rls-basics.md—ALTER TABLE ... ENABLE ROW LEVEL SECURITY+ policy patternsrules/security-rls-performance.md—SECURITY DEFINERfunctions, 5-10x faster RLS queriesrules/security-privileges.md— Principle of least privilege, specific GRANT patterns
Monitoring & Maintenance (NEW — not in other skills)
rules/monitor-vacuum-analyze.md— VACUUM/ANALYZE patterns, autovacuum tuningrules/monitor-pg-stat-statements.md— Enable and querypg_stat_statementsrules/monitor-explain-analyze.md— EXPLAIN ANALYZE usage guide
Advanced Features (NEW — not in other skills)
rules/advanced-full-text-search.md—tsvector,ts_rank, GIN full-text index, 100x vs LIKErules/advanced-jsonb-indexing.md— GIN index,jsonb_opsvsjsonb_path_opstrade-off
Query Performance (complementary to sql-optimization-patterns)
rules/query-missing-indexes.md— EXPLAIN Seq Scan detectionrules/query-index-types.md— B-tree/GIN/BRIN/Hash selectionrules/query-composite-indexes.md— Leftmost prefix rulerules/query-covering-indexes.md— INCLUDE columns for Index Only Scanrules/query-partial-indexes.md— Filtered index subsets
Schema Design (complementary to database-schema-designer)
rules/schema-primary-keys.md— IDENTITY vs UUID vs UUIDv7rules/schema-data-types.md— Forbidden types, correct alternativesrules/schema-foreign-key-indexes.md— Diagnostic SQL to find all missing FK indexesrules/schema-lowercase-identifiers.md— snake_case, no quoted identifiersrules/schema-partitioning.md— Range partitioning patternsrules/schema-foreign-key-indexes.md— FK index enforcement
Stack Integration
Python / FastAPI (asyncpg + SQLAlchemy)
- Connection pooling: asyncpg pool
min_size/max_sizeconfiguration (seerules/conn-pooling.md) - RLS: set
app.current_user_idsession variable before queries - SKIP LOCKED: use in background task workers
NestJS / Prisma
- Connection pooling:
DATABASE_URL=...?connection_limit=10&pool_timeout=20(seerules/conn-pooling.md) - Prepared statements: Prisma uses prepared statements — use session mode or
pgbouncer=trueparameter - SKIP LOCKED: use
prisma.$queryRawfor queue worker queries
Java / Spring Boot WebFlux (R2DBC)
- Connection pooling:
r2dbc.pool.max-size,r2dbc.pool.initial-size(seerules/conn-pooling.md) - RLS: use
ConnectionFactorywith per-request session variable injection
Related Skills
database-schema-designer— Schema design, Flyway migrations, normalizationsql-optimization-patterns— EXPLAIN analysis, N+1, cursor pagination, batch opspostgresql— PostgreSQL-specific types, gotchas, extensions, JSONB depthsql-pro— Cloud analytics, HTAP, BigQuery/Snowflakevector-database— pgvector HNSW/IVFFlat alignment