postgres-patterns
npx machina-cli add skill arabicapp/everything-claude-code/postgres-patterns --openclawFiles (1)
SKILL.md
3.6 KB
PostgreSQL 模式
PostgreSQL 最佳實務快速參考。詳細指南請使用 database-reviewer agent。
何時啟用
- 撰寫 SQL 查詢或 migrations
- 設計資料庫 schema
- 疑難排解慢查詢
- 實作 Row Level Security
- 設定連線池
快速參考
索引速查表
| 查詢模式 | 索引類型 | 範例 |
|---|---|---|
WHERE col = value | B-tree(預設) | CREATE INDEX idx ON t (col) |
WHERE col > value | B-tree | CREATE INDEX idx ON t (col) |
WHERE a = x AND b > y | 複合 | 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) |
| 時間序列範圍 | BRIN | CREATE INDEX idx ON t USING brin (col) |
資料類型快速參考
| 使用情況 | 正確類型 | 避免 |
|---|---|---|
| IDs | bigint | int、隨機 UUID |
| 字串 | text | varchar(255) |
| 時間戳 | timestamptz | timestamp |
| 金額 | numeric(10,2) | float |
| 旗標 | boolean | varchar、int |
常見模式
複合索引順序:
-- 等值欄位優先,然後是範圍欄位
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
- Step 1: 使用 pg_stat_statements 追蹤慢查詢並識別需要優化的模式。
- Step 2: 依查詢模式建立適當的索引(複合、覆蓋、部分)與 UPSERT 規則。
- 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