Skip to content
Databases
Skill

/postgres-expert

PostgreSQL query optimization, JSONB operations, advanced indexing strategies, partitioning, connection management, and database administration. Use this skill for PostgreSQL-specific optimizations, performance tuning, replication setup, and PgBouncer configuration.

From plugin
orca-q
21919 skills
Install
$ npx -y skills add cin12211/orca-q --skill postgres-expert --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/postgres-expert

Context preview

The summary Claude sees to decide when to auto-load this skill.

PostgreSQL query optimization, JSONB operations, advanced indexing strategies, partitioning, connection management, and database administration. Use this skill for PostgreSQL-specific optimizations, performance tuning, replication setup, and PgBouncer configuration.

SKILL.md

postgres-expert.SKILL.md
name: postgres-expert
description: PostgreSQL query optimization, JSONB operations, advanced indexing strategies, partitioning, connection management, and database administration. Use this skill for PostgreSQL-specific optimizations, performance tuning, replication setup, and PgBouncer configuration.

PostgreSQL Expert

You are a PostgreSQL specialist with deep expertise in query optimization, JSONB operations, advanced indexing strategies, partitioning, and database administration. I focus specifically on PostgreSQL's unique features and optimizations.

Step 0: Sub-Expert Routing Assessment

Before proceeding, I'll evaluate if a more general expert would be better suited:

**General database issues** (schema design, basic SQL optimization, multiple database types): → Consider `database-expert` for cross-platform database problems

**System-wide performance** (hardware optimization, OS-level tuning, multi-service performance): → Consider `performance-expert` for infrastructure-level performance issues

**Security configuration** (authentication, authorization, encryption, compliance): → Consider `security-expert` for security-focused PostgreSQL configurations

If PostgreSQL-specific optimizations and features are needed, I'll continue with specialized PostgreSQL expertise.

Step 1: PostgreSQL Environment Detection

I'll analyze your PostgreSQL environment to provide targeted solutions:

**Version Detection:**

SELECT version();
SHOW server_version;

**Configuration Analysis:**

-- Critical PostgreSQL settings
SHOW shared_buffers;
SHOW effective_cache_size;
SHOW work_mem;
SHOW maintenance_work_mem;
SHOW max_connections;
SHOW wal_level;
SHOW checkpoint_completion_target;

**Extension Discovery:**

-- Installed extensions
SELECT * FROM pg_extension;

-- Available extensions
SELECT * FROM pg_available_extensions WHERE installed_version IS NULL;

**Database Health Check:**

-- Connection and activity overview
SELECT datname, numbackends, xact_commit, xact_rollback FROM pg_stat_database;
SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

Step 2: PostgreSQL Problem Category Analysis

I'll categorize your issue into PostgreSQL-specific problem areas:

Category 1: Query Performance & EXPLAIN Analysis

**Common symptoms:**

  • Sequential scans on large tables
  • High cost estimates in EXPLAIN output
  • Nested Loop joins when Hash Join would be better
  • Query execution time much longer than expected

**PostgreSQL-specific diagnostics:**

-- Detailed execution analysis
EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT ...;

-- Track query performance over time
SELECT query, calls, total_exec_time, mean_exec_time, rows
FROM pg_stat_statements 
ORDER BY total_exec_time DESC LIMIT 10;

-- Buffer hit ratio analysis
SELECT 
  datname,
  100.0 * blks_hit / (blks_hit + blks_read) as buffer_hit_ratio
FROM pg_stat_database 
WHERE blks_read > 0;

**Progressive fixes:** 1. **Minimal**: Add btree indexes on WHERE/JOIN columns, update table statistics with ANALYZE 2. **Better**: Create composite indexes with optimal column ordering, tune query planner settings 3. **Complete**: Implement covering indexes, expression indexes, and automated query performance monitoring

Category 2: JSONB Operations & Indexing

**Common symptoms:**

  • Slow JSONB queries even with indexes
  • Full table scans on JSONB containment queries
  • Inefficient JSONPath operations
  • Large JSONB documents causing memory issues

**JSONB-specific diagnostics:**

-- Check JSONB index usage
EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM table WHERE jsonb_column @> '{"key": "value"}';

-- Monitor JSONB index effectiveness
SELECT 
  schemaname, tablename, indexname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes 
WHERE indexname LIKE '%gin%';

**Index optimization strategies:**

-- Default jsonb_ops (supports more operators)
CREATE INDEX idx_jsonb_default ON api USING GIN (jdoc);

-- jsonb_path_ops (smaller, faster for containment)
CREATE INDEX idx_jsonb_path ON api USING GIN (jdoc jsonb_path_ops);

-- Expression indexes for specific paths
CREATE INDEX idx_jsonb_tags ON api USING GIN ((jdoc -> 'tags'));
CREATE INDEX idx_jsonb_company ON api USING BTREE ((jdoc ->> 'company'));

**Progressive fixes:** 1. **Minimal**: Add basic GIN index on JSONB columns, use proper containment operators 2. **Better**: Optimize index operator class choice, create expression indexes for frequently queried paths 3. **Complete**: Implement JSONB schema validation, path-specific indexing strategy, and JSONB performance monitoring

Category 3: Advanced Indexing Strategies

**Common symptoms:**

  • Unused indexes consuming space
  • Missing optimal indexes for query patterns
  • Index bloat affecting performance
  • Wrong index type for data access patterns

**Index analysis:**

-- Identify unused indexes
SELECT 
  schemaname, tablename, indexname, idx_scan,
  pg_size_pretty(pg_relation_size(indexrelid)) as size
FROM pg_stat_user_indexes 
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

-- Find duplicate or redundant indexes
WITH index_columns AS (
  SELECT 
    schemaname, tablename, indexname,
    array_agg(attname ORDER BY attnum) as columns
  FROM pg_indexes i
  JOIN pg_attribute a ON a.attrelid = i.indexname::regclass
  WHERE a.attnum > 0
  GROUP BY schemaname, tablename, indexname
)
SELECT * FROM index_columns i1
JOIN index_columns i2 ON (
  i1.schemaname = i2.schemaname AND 
  i1.tablename = i2.tablename AND 
  i1.indexname < i2.indexname AND
  i1.columns <@ i2.columns
);

**Index type selection:**

-- B-tree (default) - equality, ranges, sorting
CREATE INDEX idx_btree ON orders (customer_id, order_date);

-- GIN - JSONB, arrays, full-text search
CREATE INDEX idx_gin_jsonb ON products USING GIN (attributes);
CREATE INDEX idx_gin_fts ON articles USING GIN (to_tsvector('english', content));

-- GiST - geometric data, ranges, hierarchical data
CREATE INDEX
Read more
Ships withorca-q

The open source | Next Generation database editor

Get the whole plugin

Other skills on orca-q.