postgresql-database-engineering

Comprehensive PostgreSQL database engineering skill covering indexing strategies, query optimization, performance tuning, partitioning, replication, backup and recovery, high availability, and production database management. Master advanced PostgreSQL features including MVCC, VACUUM operations, conn

By manutej · 1,686 installs

npx skills add manutej/luxor-claude-marketplace --skill postgresql-database-engineering

Source repository · Upstream listing

PostgreSQL Database Engineering A comprehensive skill for professional PostgreSQL database engineering, covering everything from query optimization and indexing strategies to high availability, replication, and production database management. This skill enables you to design, optimize, and maintain high performance PostgreSQL databases at scale. When to Use This Skill Use this skill when: Designing database schemas for high performance applications Optimizing slow queries and improving database performance Implementing indexing strategies for complex query patterns Setting up partitioning for large tables (100M+ rows) Configuring streaming replication and high availability Tuning PostgreSQL configuration for production workloads Implementing backup and recovery procedures Debugging performance issues and query bottlenecks Setting up connection pooling with pgBouncer or PgPool Monitoring database health and performance metrics Planning database migrations and schema changes Implementing database security and access controls Scaling PostgreSQL databases horizontally or vertically Managing VACUUM operations and database maintenance Setting up logical replication for data distribution Core Concepts PostgreSQL Architecture PostgreSQL uses a process based architecture with several key components: Postmaster Process : Main server process that manages connections Backend Processes : One per client connection, handles queries Shared Memory : Shared buffers, WAL buffers, lock tables Background Workers : Autovacuum, checkpointer, WAL writer, statistics collector Write Ahead Log (WAL) : Transaction log for durability and replication Storage Layer : TOAST for large values, FSM for free space, VM for visibility MVCC (Multi Version Concurrency Control) PostgreSQL's foundational concurrency mechanism: Snapshots : Each transaction sees a consistent snapshot of data Tuple Versions : Multiple row versions coexist for concurrent access Transaction IDs : xmin (creating transaction), xmax (deleting transaction) Visibility Rules : Determines which row versions are visible to transactions VACUUM : Reclaims space from dead tuples and prevents transaction wraparound FREEZE : Marks old rows as visible to all transactions Key Implications: No read locks readers never block writers Writers never block readers Updates create new row versions Regular VACUUM is essential Dead tuples accumulate until vacuumed Transaction Isolation Levels PostgreSQL supports four isolation levels: 1. Read Uncommitted : Treated as Read Committed in PostgreSQL 2. Read Committed (default): Sees committed data at statement start 3. Repeatable Read : Sees snapshot from transaction start 4. Serializable : True serializable isolation with SSI Choosing Isolation: Read Committed: Most applications, best performance Repeatable Read: Reports, analytics needing consistency Serializable: Financial transactions, critical consistency needs Index Types PostgreSQL offers multiple index types for different use cases: 1. B Tree (Default) Use for : Equality, range queries, sorting Supports : <, <=, =, =, , BETWEEN, IN, IS NULL Best for : Most general purpose indexing Example : Primary keys, foreign keys, timestamps 2. Hash Use for : Equality comparisons only Supports : = operator Best for : Large tables with equality lookups Limitation : Not WAL logged before PG 10, no range queries 3. GiST (Generalized Search Tree) Use for : Geometric data, full text search, custom types Supports : Overlaps, contains, nearest neighbor Best for : Spatial data, ranges, full text search Example : PostGIS geometries, tsvector, ranges 4. GIN (Generalized Inverted Index) Use for : Multi valued columns (arrays, JSONB, full text) Supports : Contains, exists operators Best for : JSONB queries, array operations, full text search Tradeoff : Slower updates, faster queries 5. BRIN (Block Range Index) Use for : Very large tables with natural ordering Supports : Range queries on sorted data Best for : Time series data, append only tables Advantage : Tiny index size, scales to billions of rows 6. SP GiST (Space Partitioned GiST) Use for : Non balanced data structures Supports : Points, ranges, IP addresses Best for : Quadtrees, k d trees, radix trees Query Planning and Optimization PostgreSQL's query planner determines execution strategies: Planner Components: Statistics : Table and column statistics for cardinality estimation Cost Model : CPU, I/O, and memory cost estimation Plan Types : Sequential scan, index scan, bitmap scan, joins Join Methods : Nested loop, hash join, merge join Optimization : Query rewriting, predicate pushdown, join reordering Key Statistics: n distinct : Number of distinct values (for selectivity) correlation : Physical row ordering correlation most common vals : MCV list for skewed distributions histogram bounds : Value distribution histogram Understanding EXPLAIN: Cost : Startup cost .. total cost (arbitrary units) Rows : Estimated row count Width : Average row size in bytes Actual Time : Real execution time (with ANALYZE) Loops : Number of times node executed Partitioning Strategies Table partitioning for managing large datasets: Range Partitioning Use for : Time series data, sequential values Example : Partition by date ranges (daily, monthly, yearly) Benefit : Easy data lifecycle management, faster queries List Partitioning Use for : Discrete categorical values Example : Partition by country, region, status Benefit : Logical data separation, partition pruning Hash Partitioning Use for : Even data distribution Example : Partition by hash(user id) Benefit : Balanced partition sizes, parallel queries Partition Pruning: Planner eliminates irrelevant partitions Drastically reduces query scope Essential for partition performance Partition Wise Operations: Partition wise joins: Join matching partitions directly Partition wise aggregation: Aggregate within partitions Parallel partition processing Replication and High Availability PostgreSQL replication options: Streaming Replication (Physical) Type : Binary WAL streaming to standby servers Modes : Asynchronous, synchronous, quorum based Use for : High availability, read scalability Failover : Automatic with tools like Patroni, repmgr Synchronous vs Asynchronous: Synchronous: Zero data loss, higher latency Asynchronous: Low latency, potential data loss Quorum: Balance between safety and performance Logical Replication Type : Row level change stream Use for : Selective replication, upgrades, multi master Benefit : Replicate specific tables, cross version Limitation : No DDL replication, overhead Cascading Replication Standbys replicate from other standbys Reduces load on primary Geographic distribution Connection Pooling Managing database connections efficiently: pgBouncer Type : Lightweight connection pooler Modes : Session, transaction, statement pooling Use for : High connection count applications Benefit : Reduced connection overhead, resource limits Pooling Modes: Session : Client connects for entire session Transaction : Connection per transaction Statement : Connection per statement (rarely used) PgPool II Type : Feature rich middleware Features : Connection pooling, load balancing, query caching Use for : Read/write splitting, connection management Benefit : Advanced routing, in memory cache VACUUM and Maintenance Critical maintenance operations: VACUUM Purpose : Reclaim dead tuple space, update statistics Types : Regular VACUUM, VACUUM FULL When : After large updates/deletes, regularly via autovacuum Impact : Regular VACUUM is non blocking ANALYZE Purpose : Update planner statistics When : After data changes, schema modifications Impact : Minimal, fast on most tables REINDEX Purpose : Rebuild indexes, fix bloat When : Index corruption, significant bloat Impact : Locks table, use REINDEX CONCURRENTLY (PG 12+) Autovacuum Purpose : Automated VACUUM and ANALYZE Configuration : Threshold based triggering Tuning : Balance resource usage vs. responsiveness Monitoring : Track autovacuum runs, prevent wraparound Performance Tuning Key configuration parameters: Memory Settings Checkpoint and WAL Query Planner Connection Settings Index Strategies Choosing the Right Index Decision Matrix: Query Pattern Index Type Reason WHERE id = 5 B tree Equality lookup WHERE created at '2024 01 01' B tree Range query ORDER BY name B tree Sorting support WHERE tags @ ARRAY['sql'] GIN Array containment WHERE data 'status' = 'active' GIN (jsonb path ops) JSONB query WHERE to tsvector(content) @@ query GIN Full text search WHERE location < point(0,0) GiST Nearest neighbor WHERE timestamp BETWEEN ... (large table) BRIN Sequential time series WHERE ip address << '192.168.0.0/16' GiST or SP GiST IP range query Composite Indexes Multi column indexes for complex queries: Column Ordering Rules: 1. Equality columns first 2. Sort/range columns last 3. High selectivity columns first 4. Match query patterns exactly Example: Partial Indexes Index subset of rows: Benefits: Smaller index size Faster updates on non indexed rows Targeted query optimization Use Cases: Index only active records: WHERE deleted at IS NULL Index recent data: WHERE created at NOW() INTERVAL '90 days' Index specific states: WHERE status IN ('pending', 'processing') Expression Indexes Index computed values: Examples: Covering Indexes (INCLUDE) Include non key columns for index only scans: Benefit: Query satisfied entirely from index, no table lookup Index Maintenance Monitoring Index Usage: Detecting Bloat: Query Optimization Using EXPLAIN ANALYZE Understanding query execution: Key Metrics: Planning Time : Time to generate plan Execution Time : Actual query runtime Shared Hit vs Read : Buffer cache hits vs disk reads Rows : Estimated vs actual row counts Filter vs Index Cond : Post scan filtering vs index usage Common Query Anti Patterns 1. N+1 Queries Problem: One query per row in a loop Solution: JOIN or batch queries 2. SELECT Problem: Fetches unnecessary columns Solution: Select only needed columns 3. Implicit Type Conversions Problem: Index not used due to type mismatch Solution: Ensure query types match column types 4. Function on Indexed Column Problem: WHERE UPPER(email) = 'USER@EXAMPLE.COM' Solution: Use expression index or compare correctly 5. OR Conditions Problem: WHERE status = 'A' OR status = 'B' Solution: Use IN : WHERE status IN ('A', 'B') Join Optimization Join Types: 1. Nested Loop Best for: Small outer table, indexed inner table How: For each outer row, scan inner table When: Small result sets, good indexes 2. Hash Join Best for: Large tables, no good indexes How: Build hash table of smaller table When: Equality joins, sufficient memory 3. Merge Join Best for: Pre sorted data, equality joins How: Sort both inputs, merge scan When: Both inputs sorted or can be sorted cheaply Join Order Matters: Planner reorders joins for optimization Statistics guide join order decisions Can force order with SET join collapse limit Aggregation Optimization Techniques: Partial Aggregates : Partition wise aggregation Hash Aggregates : In memory grouping Sorted Aggregates : Pre sorted input Parallel Aggregation : Mul