SuperAPI AI Directory

postgres-patterns

Data & analytics

View repository

Updated 10-16 04:47

About this skill

PostgreSQL Best Practices Patterns (PostgreSQL Patterns)

PostgreSQL best practices quick reference. For detailed guidance, use database-reviewer Agent.

When to Activate

  • Writing SQL queries or migration scripts
  • Designing database schema (Schema)
  • Troubleshooting slow query issues
  • Implementing Row Level Security (RLS)
  • Setting up Connection Pooling

Quick Reference

Index Cheat Sheet (Index Cheat Sheet)

Query Patterns Index Types Example
WHERE col = value B-tree (Default) CREATE INDEX idx ON t (col)
WHERE col > value B-tree CREATE INDEX idx ON t (col)
WHERE a = x AND b > y Composite Index (Composite) CREATE INDEX idx ON t (a, b)
WHERE jsonb @> '{}' GIN CREATE INDEX idx ON t USING gin (col)
WHERE tsv @@ query GIN CREATE INDEX idx ON t USING gin (col)
Time Series Range BRIN CREATE INDEX idx ON t USING brin (col)

Data Type Quick Reference

Use Case Correct Type Avoid
ID bigint int, random UUID
String text varchar(255)
Timestamp timestamptz timestamp
Amount numeric(10,2) float
Flags (Flags) boolean varchar, int

Common Patterns

Composite Index Order:

-- 等值列(Equality columns)在前,范围列(Range columns)在后
CREATE INDEX idx ON orders (status, created_at);
-- 适用于:WHERE status = 'pending' AND created_at > '2024-01-01'

Covering Index (Covering Index):

CREATE INDEX idx ON users (email) INCLUDE (name, created_at);
-- 避免在执行 SELECT email, name, created_at 时进行回表查询 (Table lookup)

Partial Index (Partial Index):

CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;
-- 索引更小,仅包含活跃用户

RLS Policy (Optimized Version):

CREATE POLICY policy ON orders
  USING ((SELECT auth.uid()) = user_id);  -- 包装在 SELECT 中!

UPSERT (Update or Insert):

INSERT INTO settings (user_id, key, value)
VALUES (123, 'theme', 'dark')
ON CONFLICT (user_id, key)
DO UPDATE SET value = EXCLUDED.value;

Cursor Pagination (Cursor Pagination):

SELECT * FROM products WHERE id > $last_id ORDER BY id LIMIT 20;
-- O(1) 复杂度,优于 O(n) 的 OFFSET

Queue Processing (Queue Processing):

UPDATE jobs SET status = 'processing'
WHERE id = (
  SELECT id FROM jobs WHERE status = 'pending'
  ORDER BY created_at LIMIT 1
  FOR UPDATE SKIP LOCKED
) RETURNING *;

Anti-Pattern Detection (Anti-Pattern Detection)

-- 查找未建立索引的外键
SELECT conrelid::regclass, a.attname
FROM pg_constraint c
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE c.contype = 'f'
  AND NOT EXISTS (
    SELECT 1 FROM pg_index i
    WHERE i.indrelid = c.conrelid AND a.attnum = ANY(i.indkey)
  );

-- 查找慢查询
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
WHERE mean_exec_time > 100
ORDER BY mean_exec_time DESC;

-- 检查表膨胀 (Table Bloat)
SELECT relname, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;

Configuration Templates

-- 连接限制 (根据 RAM 调整)
ALTER SYSTEM SET max_connections = 100;
ALTER SYSTEM SET work_mem = '8MB';

-- 超时设置
ALTER SYSTEM SET idle_in_transaction_session_timeout = '30s';
ALTER SYSTEM SET statement_timeout = '30s';

-- 监控
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- 安全默认值
REVOKE ALL ON SCHEMA public FROM public;

SELECT pg_reload_conf();

Related Resources

  • Agent (Agent):database-reviewer - Complete database review workflow
  • Skill (Skill):clickhouse-io - ClickHouse analysis patterns
  • Skill (Skill):backend-patterns - API and backend patterns

Based on Supabase Agent Skills (Supabase Agent Skills) (Acknowledgments: Supabase team) (MIT License)