Token导航 LogoToken导航

Agent Skill · 研究检索

sql-optimization-patterns(SQL 优化模式)

用于辅助数据库表结构、查询语句、迁移脚本和数据维护任务。它适合让 Agent 分析 schema、编写 SQL、排查查询问题、整理索引或生成迁移建议。使用时需要明确数据库类型、连接环境和目标表,区分只读分析与写入变更;涉及删除、更新、迁移和批量导入时,应优先 dry-run、备份或事务保护,避免误操作。

sql-optimization-patterns 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为权限未标注;许可证为 MIT,暂无第三方扫描结果,按安装量在研究检索类的 73,675 个 Skill 里排第 49,494。

总安装 649周安装 26GitHub Stars 公开资料未说明下载 210核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:sql-optimization-patterns(SQL 优化模式)
来源仓库:https://github.com/icartsh/icartsh_plugin
仓库路径:skills/sql-optimization-patterns
安装命令:
npx skills add icartsh/icartsh_plugin --skill "sql-optimization-patterns"
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

AgentSkills.tonpx skills
npx skills add icartsh/icartsh_plugin --skill "sql-optimization-patterns"

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于辅助数据库表结构、查询语句和迁移脚本任务。sql-optimization-patterns 属于研究检索类 Skill,可作为该场景下的辅助能力补充。适合分析 schema、编写 SQL 或排查查询问题。使用时需明确数据库类型和连接环境,区分只读与分析。涉及删除、更新或迁移时,应优先 dry-run 或事务保护。

安装前请确认来源仓库和权限范围,确保维护状态正常。

来源仓库内路径:skills/sql-optimization-patterns

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add icartsh/icartsh_plugin --skill "sql-optimization-patterns";命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    权限没有明确标注,第一次使用时只给一个无关紧要的任务,观察它到底读了哪些文件和网络。

常见问题

6 条

sql-optimization-patterns 怎么安装?

在终端执行 npx skills add icartsh/icartsh_plugin --skill "sql-optimization-patterns"。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

sql-optimization-patterns 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

sql-optimization-patterns 需要什么权限?

权限级别没有明确标注。第一次使用时建议只给无关紧要的任务,观察它实际读写了哪些内容。

sql-optimization-patterns 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

sql-optimization-patterns 用的人多吗?

公开数据是累计安装 649 次,近一周安装 26 次,下载 210 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

sql-optimization-patterns 安全吗?

没有查到第三方扫描结果,安全性无法从公开资料判断,安装前请自行审查源码、依赖和命令行为。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 许可证明确为 MIT,商用和分发边界好判断。

先想清楚的地方

  • 没有第三方扫描结果,安全性只能靠自己读源码判断。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 要求有安全扫描结论才肯安装的团队。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
sql-optimization-patterns

SQL 优化模式 · 本页

649—权限未标注MIT未收录

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
sql-optimization-patterns
description
SQL 쿼리 최적화, 인덱스 전략 및 EXPLAIN 분석을 마스터하여 데이터베이스 성능을 획기적으로 향상시키고 느린 쿼리를 제거합니다. 느린 쿼리 디버깅, 데이터베이스 스키마 설계 또는 애플리케이션 성능 최적화 시 사용하세요.

SQL Optimization Patterns

체계적인 최적화, 올바른 인덱싱 및 쿼리 실행 계획 분석을 통해 느린 데이터베이스 쿼리를 번개처럼 빠른 작업으로 변환하세요.

적용 시기

  • 느리게 실행되는 쿼리 디버깅
  • 성능이 뛰어난 데이터베이스 스키마 설계
  • 애플리케이션 응답 시간 최적화
  • 데이터베이스 부하 및 비용 절감
  • 데이터 증가에 따른 확장성 개선
  • EXPLAIN 쿼리 실행 계획 분석
  • 효율적인 인덱스 구현
  • N+1 쿼리 문제 해결

핵심 개념 (Core Concepts)

1. 쿼리 실행 계획 (EXPLAIN)

EXPLAIN 출력을 이해하는 것은 최적화의 기본입니다.

PostgreSQL EXPLAIN:

-- 기본 실행 계획 확인
EXPLAIN SELECT * FROM users WHERE email = ' [email protected] ';

-- 실제 실행 통계 포함
EXPLAIN ANALYZE
SELECT * FROM users WHERE email = ' [email protected] ';

-- 더 많은 세부 정보를 포함한 상세 출력
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT u.*, o.order_total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.created_at > NOW() - INTERVAL '30 days';

주의 깊게 봐야 할 주요 지표:

  • Seq Scan: 전체 테이블 스캔 (대용량 테이블에서는 대개 느림)
  • Index Scan: 인덱스 사용 (좋음)
  • Index Only Scan: 테이블 접근 없이 인덱스만 사용 (가장 좋음)
  • Nested Loop: 조인 방식 (작은 데이터셋에는 괜찮음)
  • Hash Join: 조인 방식 (큰 데이터셋에 좋음)
  • Merge Join: 조인 방식 (정렬된 데이터에 좋음)
  • Cost: 추정된 쿼리 비용 (낮을수록 좋음)
  • Rows: 추정된 반환 행 수
  • Actual Time: 실제 실행 시간

2. 인덱스 전략 (Index Strategies)

인덱스는 가장 강력한 최적화 도구입니다.

인덱스 유형:

  • B-Tree: 기본값, 등호(=) 및 범위 쿼리에 좋음
  • Hash: 등호(=) 비교에만 사용
  • GIN: 전체 텍스트 검색, 배열 쿼리, JSONB
  • GiST: 기하학적 데이터, 전체 텍스트 검색
  • BRIN: 데이터 간 상관관계가 있는 매우 큰 테이블을 위한 블록 범위 인덱스
-- 표준 B-Tree 인덱스
CREATE INDEX idx_users_email ON users(email);

-- 복합 인덱스 (순서가 중요합니다!)
CREATE INDEX idx_orders_user_status ON orders(user_id, status);

-- 부분 인덱스 (행의 일부만 인덱싱)
CREATE INDEX idx_active_users ON users(email)
WHERE status = 'active';

-- 표현식 인덱스 (함수 기반 인덱스)
CREATE INDEX idx_users_lower_email ON users(LOWER(email));

-- 커버링 인덱스 (추가 컬럼 포함)
CREATE INDEX idx_users_email_covering ON users(email)
INCLUDE (name, created_at);

-- 전체 텍스트 검색 인덱스
CREATE INDEX idx_posts_search ON posts
USING GIN(to_tsvector('english', title || ' ' || body));

-- JSONB 인덱스
CREATE INDEX idx_metadata ON events USING GIN(metadata);

3. 쿼리 최적화 패턴

**SELECT * 피하기:**

-- 나쁨: 불필요한 모든 컬럼을 가져옴
SELECT * FROM users WHERE id = 123;

-- 좋음: 필요한 컬럼만 명시
SELECT id, email, name FROM users WHERE id = 123;

WHERE 절의 효율적 사용:

-- 나쁨: 함수 사용으로 인덱스 활용 불가
SELECT * FROM users WHERE LOWER(email) = ' [email protected] ';

-- 좋음: 함수 기반 인덱스(functional index) 생성 또는 정확한 일치 사용
CREATE INDEX idx_users_email_lower ON users(LOWER(email));
-- 그 다음:
SELECT * FROM users WHERE LOWER(email) = ' [email protected] ';

-- 또는 데이터를 정규화하여 저장
SELECT * FROM users WHERE email = ' [email protected] ';

JOIN 최적화:

-- 나쁨: 카테시안 곱 생성 후 필터링
SELECT u.name, o.total
FROM users u, orders o
WHERE u.id = o.user_id AND u.created_at > '2024-01-01';

-- 좋음: 조인 전 필터링
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2024-01-01';

-- 더 좋음: 두 테이블 모두 사전 필터링
SELECT u.name, o.total
FROM (SELECT * FROM users WHERE created_at > '2024-01-01') u
JOIN orders o ON u.id = o.user_id;

최적화 패턴 (Optimization Patterns)

패턴 1: N+1 쿼리 제거

문제: N+1 쿼리 안티 패턴

# 나쁨: N+1개의 쿼리를 실행함
users = db.query("SELECT * FROM users LIMIT 10")
for user in users:
    orders = db.query("SELECT * FROM orders WHERE user_id = ?", user.id)
    # orders 처리

해결책: JOIN 또는 배치 로딩(Batch Loading) 사용

-- 해결책 1: JOIN 사용
SELECT
    u.id, u.name,
    o.id as order_id, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id IN (1, 2, 3, 4, 5);

-- 해결책 2: 배치 쿼리
SELECT * FROM orders
WHERE user_id IN (1, 2, 3, 4, 5);
# 좋음: JOIN 또는 배치 로드를 통한 단일 쿼리 실행
# JOIN 사용 시
results = db.query("""
    SELECT u.id, u.name, o.id as order_id, o.total
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id IN (1, 2, 3, 4, 5)
""")

# 또는 배치 로드(Batch load)
users = db.query("SELECT * FROM users LIMIT 10")
user_ids = [u.id for u in users]
orders = db.query(
    "SELECT * FROM orders WHERE user_id IN (?)",
    user_ids
)
# user_id별로 orders 그룹화
orders_by_user = {}
for order in orders:
    orders_by_user.setdefault(order.user_id, []).append(order)

패턴 2: 페이지네이션(Pagination) 최적화

나쁨: 대용량 테이블에서의 OFFSET 사용

-- 큰 offset 값에서 속도 저하 발생
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 20 OFFSET 100000;  -- 매우 느림!

좋음: 커서 기반 페이지네이션 (Cursor-Based Pagination)

-- 훨씬 빠름: 커서(마지막 확인된 ID) 사용
SELECT * FROM users
WHERE created_at < '2024-01-15 10:30:00'  -- 마지막 커서
ORDER BY created_at DESC
LIMIT 20;

-- 복합 정렬 시
SELECT * FROM users
WHERE (created_at, id) < ('2024-01-15 10:30:00', 12345)
ORDER BY created_at DESC, id DESC
LIMIT 20;

-- 인덱스 필요
CREATE INDEX idx_users_cursor ON users(created_at DESC, id DESC);

패턴 3: 효율적인 집계 (Aggregate Efficiently)

COUNT 쿼리 최적화:

-- 나쁨: 모든 행을 카운트함
SELECT COUNT(*) FROM orders;  -- 큰 테이블에서 느림

-- 좋음: 근사치를 위한 추정치(estimates) 사용
SELECT reltuples::bigint AS estimate
FROM pg_class
WHERE relname = 'orders';

-- 좋음: 카운트 전 필터링 적용
SELECT COUNT(*) FROM orders
WHERE created_at > NOW() - INTERVAL '7 days';

-- 더 좋음: 인덱스 전용 스캔(index-only scan) 활용
CREATE INDEX idx_orders_created ON orders(created_at);
SELECT COUNT(*) FROM orders
WHERE created_at > NOW() - INTERVAL '7 days';

GROUP BY 최적화:

-- 나쁨: 그룹화 후 필터링
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 10;

-- 좋음: 가능한 경우 먼저 필터링 후 그룹화
SELECT user_id, COUNT(*) as order_count
FROM orders
WHERE status = 'completed'
GROUP BY user_id
HAVING COUNT(*) > 10;

-- 가장 좋음: 커버링 인덱스 활용
CREATE INDEX idx_orders_user_status ON orders(user_id, status);

패턴 4: 서브쿼리 최적화

상관 서브쿼리(Correlated Subqueries) 변환:

-- 나쁨: 상관 서브쿼리 (각 행마다 실행됨)
SELECT u.name, u.email,
    (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as order_count
FROM users u;

-- 좋음: 집계가 포함된 JOIN
SELECT u.name, u.email, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.name, u.email;

-- 더 좋음: 윈도우 함수 사용
SELECT DISTINCT ON (u.id)
    u.name, u.email,
    COUNT(o.id) OVER (PARTITION BY u.id) as order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;

가독성을 위한 CTE 사용:

-- 공통 테이블 식별자(CTE) 활용
WITH recent_users AS (
    SELECT id, name, email
    FROM users
    WHERE created_at > NOW() - INTERVAL '30 days'
),
user_order_counts AS (
    SELECT user_id, COUNT(*) as order_count
    FROM orders
    WHERE created_at > NOW() - INTERVAL '30 days'
    GROUP BY user_id
)
SELECT ru.name, ru.email, COALESCE(uoc.order_count, 0) as orders
FROM recent_users ru
LEFT JOIN user_order_counts uoc ON ru.id = uoc.user_id;

패턴 5: 배치 작업 (Batch Operations)

배치 INSERT:

-- 나쁨: 다수의 개별 insert 수행
INSERT INTO users (name, email) VALUES ('Alice', ' [email protected] ');
INSERT INTO users (name, email) VALUES ('Bob', ' [email protected] ');
INSERT INTO users (name, email) VALUES ('Carol', ' [email protected] ');

-- 좋음: 배치 insert
INSERT INTO users (name, email) VALUES
    ('Alice', ' [email protected] '),
    ('Bob', ' [email protected] '),
    ('Carol', ' [email protected] ');

-- 더 좋음: 대량 insert 시 COPY 활용 (PostgreSQL)
COPY users (name, email) FROM '/tmp/users.csv' CSV HEADER;

배치 UPDATE:

-- 나쁨: 반복문 내 업데이트
UPDATE users SET status = 'active' WHERE id = 1;
UPDATE users SET status = 'active' WHERE id = 2;
-- ... 많은 ID를 반복

-- 좋음: IN 절을 활용한 단일 UPDATE
UPDATE users
SET status = 'active'
WHERE id IN (1, 2, 3, 4, 5, ...);

-- 더 좋음: 대량 배치 시 임시 테이블 활용
CREATE TEMP TABLE temp_user_updates (id INT, new_status VARCHAR);
INSERT INTO temp_user_updates VALUES (1, 'active'), (2, 'active'), ...;

UPDATE users u
SET status = t.new_status
FROM temp_user_updates t
WHERE u.id = t.id;

고급 기범 (Advanced Techniques)

구체화된 뷰 (Materialized Views)

비용이 많이 드는 쿼리를 미리 계산해 둡니다.

-- 구체화된 뷰 생성
CREATE MATERIALIZED VIEW user_order_summary AS
SELECT
    u.id,
    u.name,
    COUNT(o.id) as total_orders,
    SUM(o.total) as total_spent,
    MAX(o.created_at) as last_order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;

-- 구체화된 뷰에 인덱스 추가
CREATE INDEX idx_user_summary_spent ON user_order_summary(total_spent DESC);

-- 구체화된 뷰 갱신
REFRESH MATERIALIZED VIEW user_order_summary;

-- 동시 갱신 (PostgreSQL, 락 최소화)
REFRESH MATERIALIZED VIEW CONCURRENTLY user_order_summary;

-- 구체화된 뷰 쿼리 (매우 빠름)
SELECT * FROM user_order_summary
WHERE total_spent > 1000
ORDER BY total_spent DESC;

파티셔닝 (Partitioning)

성능 향상을 위해 대형 테이블을 나눕니다.

-- 날짜별 범위 파티셔닝 (PostgreSQL)
CREATE TABLE orders (
    id SERIAL,
    user_id INT,
    total DECIMAL,
    created_at TIMESTAMP
) PARTITION BY RANGE (created_at);

-- 파티션 생성
CREATE TABLE orders_2024_q1 PARTITION OF orders
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

CREATE TABLE orders_2024_q2 PARTITION OF orders
    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

-- 쿼리는 자동으로 적절한 파티션을 사용함
SELECT * FROM orders
WHERE created_at BETWEEN '2024-02-01' AND '2024-02-28';
-- orders_2024_q1 파티션만 스캔함

쿼리 힌트 및 최적화

-- 인덱스 사용 강제 (MySQL)
SELECT * FROM users
USE INDEX (idx_users_email)
WHERE email = ' [email protected] ';

-- 병렬 쿼리 (PostgreSQL)
SET max_parallel_workers_per_gather = 4;
SELECT * FROM large_table WHERE condition;

-- 조인 힌트 (PostgreSQL)
SET enable_nestloop = OFF;  -- hash join 또는 merge join 강제

모범 사례 (Best Practices)

  1. 선별적인 인덱싱: 인덱스가 너무 많으면 쓰기 작업이 느려집니다.
  2. 쿼리 성능 모니터링: 느린 쿼리 로그(slow query logs)를 활용하세요.
  3. 통계 정보 업데이트 유지: 정기적으로 ANALYZE를 실행하세요.
  4. 적절한 데이터 타입 사용: 작은 타입일수록 성능이 좋습니다.
  5. 사려 깊은 정규화: 정규화와 성능 사이의 균형을 맞추세요.
  6. 자주 접근하는 데이터 캐싱: 애플리케이션 레벨 캐싱을 활용하세요.
  7. 커넥션 풀링 (Connection Pooling): 데이터베이스 연결을 재사용하세요.
  8. 정기적인 유지보수: VACUUM, ANALYZE, 인덱스 재빌드 등을 수행하세요.
-- 통계 업데이트
ANALYZE users;
ANALYZE VERBOSE orders;

-- Vacuum (PostgreSQL)
VACUUM ANALYZE users;
VACUUM FULL users;  -- 공간 회수 (테이블 락 발생)

-- 인덱스 재구성
REINDEX INDEX idx_users_email;
REINDEX TABLE users;

자주 발생하는 문제 (Common Pitfalls)

  • 과도한 인덱싱: 각 인덱스는 INSERT/UPDATE/DELETE 속도를 늦춥니다.
  • 사용되지 않는 인덱스: 공간을 낭비하고 쓰기 성능을 저하시킵니다.
  • 인덱스 누락: 쿼리 속도 저하, 전체 테이블 스캔 유발.
  • 암시적 타입 변환: 인덱스 사용을 방해합니다.
  • OR 조건: 인덱스를 효율적으로 사용하기 어렵게 만들 수 있습니다.
  • 와일드카드가 앞에 붙은 LIKE: LIKE '%abc'는 인덱스를 탈 수 없습니다.
  • WHERE 절의 함수: 기능 기반 인덱스가 없다면 인덱스 사용을 방해합니다.

쿼리 모니터링

-- 느린 쿼리 찾기 (PostgreSQL)
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- 누락된 인덱스 찾기 (PostgreSQL)
SELECT
    schemaname,
    tablename,
    seq_scan,
    seq_tup_read,
    idx_scan,
    seq_tup_read / seq_scan AS avg_seq_tup_read
FROM pg_stat_user_tables
WHERE seq_scan > 0
ORDER BY seq_tup_read DESC
LIMIT 10;

-- 사용되지 않는 인덱스 찾기 (PostgreSQL)
SELECT
    schemaname,
    tablename,
    indexname,
    idx_scan,
    idx_tup_read,
    idx_tup_fetch
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

리소스

  • references/postgres-optimization-guide.md: PostgreSQL 전용 최적화
  • references/mysql-optimization-guide.md: MySQL/MariaDB 최적화
  • references/query-plan-analysis.md: EXPLAIN 실행 계획 심층 분석
  • assets/index-strategy-checklist.md: 인덱스 생성 시점 및 방법
  • assets/query-optimization-checklist.md: 단계별 최적화 가이드
  • scripts/analyze-slow-queries.sql: 데이터베이스 내 느린 쿼리 식별
  • scripts/index-recommendations.sql: 인덱스 권장 사항 생성

平台分布

Claude Code

28.98%
按下载量换算61

Antigravity

23.04%
按下载量换算48

Gemini CLI

17.8%
按下载量换算37

windsurf

12.49%
按下载量换算26

trae

6.89%
按下载量换算14

OpenCode

3.6%
按下载量换算8

安全审计

暂无安全审计结果可展示。

权限和风险

权限未标注

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills