본문으로 건너뛰기
cccskills
무료GitHub에 공개

postgres-optimization

PostgreSQL optimization including indexes, query plans, partitioning, JSONB operations, and connection pooling

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구PostgreSQL
설치 방법 보기

포함된 파일(1)

  • SKILL.md4.4 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

PostgreSQL Optimization

Index Strategies

-- B-tree index for equality and range queries (default)
CREATE INDEX idx_orders_customer_id ON orders (customer_id);

-- Composite index (column order matters: equality columns first, range last)
CREATE INDEX idx_orders_status_created ON orders (status, created_at DESC);

-- Partial index (smaller, faster for filtered queries)
CREATE INDEX idx_orders_pending ON orders (created_at)
  WHERE status = 'pending';

-- Covering index (avoids table lookup entirely)
CREATE INDEX idx_users_email_name ON users (email) INCLUDE (name, avatar_url);

-- GIN index for JSONB containment queries
CREATE INDEX idx_products_metadata ON products USING GIN (metadata);

-- GiST index for full-text search
CREATE INDEX idx_articles_search ON articles USING GiST (
  to_tsvector('english', title || ' ' || body)
);

-- Concurrent index creation (no table lock)
CREATE INDEX CONCURRENTLY idx_large_table_col ON large_table (col);

Reading Query Plans

EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT o.id, o.total, u.name
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 'shipped'
  AND o.created_at > NOW() - INTERVAL '30 days'
ORDER BY o.created_at DESC
LIMIT 20;

Key things to look for in the plan:

  • Seq Scan on large tables indicates a missing index
  • Nested Loop with high row estimates suggests missing join index
  • Sort without Index Scan means the sort is happening in memory/disk
  • Buffers: shared hit vs shared read shows cache efficiency

Partitioning

CREATE TABLE events (
    id          BIGINT GENERATED ALWAYS AS IDENTITY,
    event_type  TEXT NOT NULL,
    payload     JSONB NOT NULL,
    created_at  TIMESTAMPTZ NOT NULL DEFAULT NOW()
) PARTITION BY RANGE (created_at);

CREATE TABLE events_2024_q1 PARTITION OF events
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

-- Index on each partition (inherited automatically in PG 11+)
CREATE INDEX ON events (created_at, event_type);

Partition tables with more than 10M rows when queries consistently filter on the partition key.

JSONB Operations

-- Query nested JSONB fields
SELECT * FROM products
WHERE metadata @> '{"category": "electronics"}'
  AND (metadata ->> 'price')::numeric < 500;

-- Update nested JSONB
UPDATE products
SET metadata = jsonb_set(metadata, '{stock}', to_jsonb(stock - 1))
WHERE id = 'abc';

-- Aggregate JSONB arrays
SELECT id, jsonb_array_elements_text(metadata -> 'tags') AS tag
FROM products
WHERE metadata ? 'tags';

Connection Pooling

# pgbouncer.ini
[databases]
app = host=localhost port=5432 dbname=app

[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 25
min_pool_size = 5
reserve_pool_size = 5
server_idle_timeout = 300

Use transaction-level pooling for web applications. Session-level pooling for apps that use prepared statements or temp tables.

Common Tuning Parameters

-- Check for slow queries
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

-- Find unused indexes
SELECT indexrelname, idx_scan, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

Anti-Patterns

  • Creating indexes on every column instead of analyzing actual query patterns
  • Using SELECT * when only a few columns are needed
  • Not using EXPLAIN ANALYZE to verify index usage
  • Storing large blobs in JSONB when a separate table with proper types is better
  • Missing connection pooling (each connection uses ~10MB of server memory)
  • Running VACUUM FULL during peak hours (locks the entire table)

Checklist

  • Indexes match actual query patterns (check pg_stat_statements)
  • Composite indexes ordered: equality, then sort, then range columns
  • EXPLAIN ANALYZE run on all critical queries
  • Partial indexes used for frequently filtered subsets
  • Connection pooler (PgBouncer/pgcat) in front of PostgreSQL
  • Table partitioning considered for tables over 10M rows
  • Unused indexes identified and dropped
  • pg_stat_statements enabled for query performance monitoring

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Web accessibility patterns for WCAG 2.2 compliance including ARIA, keyboard navigation, screen readers, and testing

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

rohitg00/awesome-claude-code-toolkit2.7천2026년 5월 12일 업데이트

Route broad or ambiguous AgentKit SEO work to the right module while keeping context scoped. Use when a request spans multiple surfaces, asks for overall digital-presence strategy, involves provider or install architecture, needs agent-context planning, or the correct platform skill is unclear.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

rohitg00/awesome-claude-code-toolkit2.7천2026년 5월 12일 업데이트

REST API design with resource naming, pagination, versioning, and OpenAPI spec generation

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

rohitg00/awesome-claude-code-toolkit2.7천2026년 5월 12일 업데이트

Authentication and authorization patterns including OAuth2, JWT, RBAC, session management, and PKCE flows

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

rohitg00/awesome-claude-code-toolkit2.7천2026년 5월 12일 업데이트

AWS cloud patterns for Lambda, ECS, S3, DynamoDB, and Infrastructure as Code with CDK/Terraform

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

rohitg00/awesome-claude-code-toolkit2.7천2026년 5월 12일 업데이트

CI/CD pipeline patterns for GitHub Actions, GitLab CI, testing strategies, and deployment automation

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

rohitg00/awesome-claude-code-toolkit2.7천2026년 5월 12일 업데이트

rohitg00의 스킬 모두 보기

이 스킬의 문제 신고