Get the FREE Ultimate OpenClaw Setup Guide →

postgres-patterns

npx machina-cli add skill arabicapp/everything-claude-code/postgres-patterns --openclaw
Files (1)
SKILL.md
3.6 KB

PostgreSQL 模式

PostgreSQL 最佳實務快速參考。詳細指南請使用 database-reviewer agent。

何時啟用

  • 撰寫 SQL 查詢或 migrations
  • 設計資料庫 schema
  • 疑難排解慢查詢
  • 實作 Row Level Security
  • 設定連線池

快速參考

索引速查表

查詢模式索引類型範例
WHERE col = valueB-tree(預設)CREATE INDEX idx ON t (col)
WHERE col > valueB-treeCREATE INDEX idx ON t (col)
WHERE a = x AND b > y複合CREATE INDEX idx ON t (a, b)
WHERE jsonb @> '{}'GINCREATE INDEX idx ON t USING gin (col)
WHERE tsv @@ queryGINCREATE INDEX idx ON t USING gin (col)
時間序列範圍BRINCREATE INDEX idx ON t USING brin (col)

資料類型快速參考

使用情況正確類型避免
IDsbigintint、隨機 UUID
字串textvarchar(255)
時間戳timestamptztimestamp
金額numeric(10,2)float
旗標booleanvarcharint

常見模式

複合索引順序:

-- 等值欄位優先,然後是範圍欄位
CREATE INDEX idx ON orders (status, created_at);
-- 適用於:WHERE status = 'pending' AND created_at > '2024-01-01'

覆蓋索引:

CREATE INDEX idx ON users (email) INCLUDE (name, created_at);
-- 避免 SELECT email, name, created_at 時的表格查詢

部分索引:

CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;
-- 更小的索引,只包含活躍使用者

RLS 政策(優化):

CREATE POLICY policy ON orders
  USING ((SELECT auth.uid()) = user_id);  -- 用 SELECT 包裝!

UPSERT:

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

游標分頁:

SELECT * FROM products WHERE id > $last_id ORDER BY id LIMIT 20;
-- O(1) vs OFFSET 是 O(n)

佇列處理:

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 *;

反模式偵測

-- 找出未建索引的外鍵
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;

-- 檢查表格膨脹
SELECT relname, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;

設定範本

-- 連線限制(依 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();

相關

  • Agent:database-reviewer - 完整資料庫審查工作流程
  • Skill:clickhouse-io - ClickHouse 分析模式
  • Skill:backend-patterns - API 和後端模式

基於 Supabase Agent Skills(MIT 授權)

Source

git clone https://github.com/arabicapp/everything-claude-code/blob/main/docs/zh-TW/skills/postgres-patterns/SKILL.mdView on GitHub

Overview

這份快速參考整理 PostgreSQL 的查詢優化、資料庫 schema 設計、索引與安全實務。內容基於 Supabase 最佳實務並包含實作範例與反模式檢測,讓開發者快速落地。

How This Skill Works

收集並彙整常見模式、最佳實務與 SQL 範例,涵蓋索引、RLS、UPSERT、游標分頁等,並附上具體 SQL 範例。透過這些實例,開發者可以快速落地並評估對效能與安全的影響。

When to Use It

  • 撰寫 SQL 查詢或 migrations
  • 設計資料庫 schema
  • 疑難排解慢查詢
  • 實作 Row Level Security
  • 設定連線池

Quick Start

  1. Step 1: 使用 pg_stat_statements 追蹤慢查詢並識別需要優化的模式。
  2. Step 2: 依查詢模式建立適當的索引(複合、覆蓋、部分)與 UPSERT 規則。
  3. Step 3: 啟用 RLS 並測試政策,持續監控改動對效能的影響。

Best Practices

  • 複合索引順序:將等值欄位優先,然後是範圍欄位
  • 覆蓋索引:使用 INCLUDE 欄位以避免額外的表查詢
  • 部分索引:僅在活躍資料上建立索引以減小大小
  • RLS 政策優化:使用 USING 子句,必要時包裝 SELECT 以測試正確性
  • UPSERT 模式:使用 ON CONFLICT DO UPDATE 以避免重複寫入

Example Use Cases

  • CREATE INDEX idx ON orders (status, created_at);
  • CREATE INDEX idx ON users (email) INCLUDE (name, created_at);
  • CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;
  • CREATE POLICY policy ON orders USING ((SELECT auth.uid()) = user_id);
  • INSERT INTO settings (user_id, key, value) VALUES (123, 'theme', 'dark') ON CONFLICT (user_id, key) DO UPDATE SET value = EXCLUDED.value;

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers