스킬 supabase-postgres-best-practices
🐘

supabase-postgres-best-practices

안전 ⚡ 스크립트 포함⚙️ 외부 명령어🌐 네트워크 접근

전문가 모범 사례로 Postgres 성능 최적화하기

또한 다음에서 사용할 수 있습니다: supabase

느린 쿼리와 부적절한 스키마 설계는 Postgres 애플리케이션의 고질적인 문제입니다. 이 스킬은 10~1000 배 성능 향상을 달성하기 위한 Supabase 전문가의 26 가지 우선순위 규칙을 제공합니다.

지원: Claude Codex Code(CC)
📊 70 적절함
1

스킬 ZIP 다운로드

2

Claude에서 업로드

설정 → 기능 → 스킬 → 스킬 업로드로 이동

3

토글을 켜고 사용 시작

테스트해 보기

"supabase-postgres-best-practices" 사용 중입니다. Review my Postgres query and suggest optimizations based on best practices: SELECT * FROM events WHERE user_id = 123 ORDER BY created_at DESC LIMIT 20

예상 결과:

query-missing-indexes.md 규칙에 따르면, 쿼리에 필터 및 정렬 칼럼에 대한 인덱스가 필요합니다:

1. 복합 인덱스 추가:
```sql
CREATE INDEX events_user_id_created_at_idx
ON events (user_id, created_at DESC);
```

2. 예상 개선: 인덱스 스캔으로 비용이 25,000 에서 8.44 로 감소합니다 (대규모 테이블에서 100~1000 배 빠름).

3. LIMIT 쿼리의 경우, 특정 칼럼만 필요한 경우 커버링 인덱스를 사용하여 테이블 조회를 피하는 것을 고려하세요.

"supabase-postgres-best-practices" 사용 중입니다. Is this batch insert pattern following best practices? for (let i = 0; i < 1000; i++) { await db.query('INSERT INTO logs (message) VALUES ($1)', [logs[i]]); }

예상 결과:

아니요, 이는 data-batch-inserts.md 규칙을 위반합니다:

- 1000 개의 개별 라운드트립
- 1000 개의 별도 트랜잭션
- 필요보다 10~50 배 느린 것으로 추정

올바른 접근 방식 (규칙 참조):
```sql
INSERT INTO logs (message) VALUES
($1), ($2), ($3), ... up to ~1000 rows;
```

또는 대량 가져오기의 경우 COPY 를 사용하세요 (가장 빠른 방법). 예시는 data-batch-inserts.md 를 참조하세요.

"supabase-postgres-best-practices" 사용 중입니다. Should I add an index on this foreign key column that gets queried occasionally?

예상 결과:

네, 확실합니다. schema-foreign-key-indexes.md 에 따르면:

**영향력: 중요 (5~20 배 향상)**

외래 키 칼럼은 거의 항상 인덱스가 있어야 합니다. 이유는:
1. 외래 키에 대한 JOIN 은 인덱스 없이 순차 스캔을 발생시킵니다
2. 부모 테이블의 DELETE 는 자식 테이블 스캔이 필요합니다
3. 캐스케이드 연산은 대규모 테이블에서 기하급수적으로 느려집니다

규칙 노트: 때때로만 쿼리되는 경우에도 인덱스 비용이 기하급수적으로 증가하므로 외래 키 인덱싱의 이점을 얻을 수 있습니다.

보안 감사

안전
v1 • 2/25/2026

All 710 static findings are false positives. This is a documentation-only skill containing Postgres best practices in Markdown format. The flagged patterns (backticks, MD5 references, URLs, system queries) are all legitimate SQL examples, documentation links, and monitoring queries. No executable code, no data exfiltration, no malicious intent detected.

37
스캔된 파일
3,485
분석된 줄 수
8
발견 사항
1
총 감사 수
중간 위험 문제 (1)
False Positive - SQL Code Blocks Flagged as External Commands
Static scanner detected 344 instances of 'Ruby/shell backtick execution' across Markdown files. Investigation confirms these are Markdown code blocks containing SQL examples (e.g., ```sql ... ```) and inline backticks for emphasis. No actual shell execution exists. Confidence: 0.98 - Direct evidence that backticks are Markdown syntax, not executable code.
낮은 위험 문제 (4)
False Positive - MD5 References Not Cryptographic Weakness
Static scanner flagged 46 instances of 'Weak cryptographic algorithm (MD5)'. Investigation confirms these are: (1) MD5 checksums in documentation URLs (Supabase/PostgreSQL docs), (2) File integrity hashes in metadata.json, not actual cryptographic implementations. No security risk. Confidence: 0.95 - Clear evidence these are documentation references, not crypto code.
False Positive - Hardcoded URLs Are Legitimate Documentation Links
Static scanner detected 72 'Hardcoded URL' instances. Investigation confirms all are legitimate documentation references to supabase.com/docs and postgresql.org/docs. No external data exfiltration, no malicious endpoints. Confidence: 0.99 - All URLs point to official Supabase/PostgreSQL documentation.
False Positive - System Queries Are Legitimate Monitoring
Static scanner flagged 158 'System reconnaissance' patterns. Investigation confirms these are standard PostgreSQL monitoring queries (pg_stat_activity, pg_class, pg_indexes) used for performance diagnostics. No reconnaissance activity. Confidence: 0.97 - Standard Postgres system catalog queries for DBA monitoring.
False Positive - SQL WITH Clauses Not JavaScript with Statements
Static scanner detected 4 'with statement (deprecated)' patterns. Investigation confirms these are SQL Common Table Expressions (CTEs) using 'WITH' clause, not deprecated JavaScript 'with' statements. No scope confusion risk. Confidence: 0.99 - Clearly SQL syntax in Postgres documentation.
감사자: claude

품질 점수

38
아키텍처
100
유지보수성
87
콘텐츠
31
커뮤니티
92
보안
91
사양 준수

만들 수 있는 것

쿼리 성능 문제 해결

느린 API 엔드포인트를 경험하는 개발자가 쿼리 최적화 규칙을 사용하여 인덱스를 추가하고 쿼리를 재작성하여 100~1000 배 개선을 달성합니다.

데이터베이스 스키마 설계 검토

데이터베이스 설계자가 비용이 많이 드는 리팩토링을 피하기 위해 멀티테넌트 SaaS 애플리케이션 출시 전에 스키마 설계 규칙을 검토합니다.

Postgres 마이그레이션 계획

DevOps 엔지니어가 RLS 및 커넥션 풀링 가이드라인을 사용하여 싱글테넌트에서 멀티테넌트 아키텍처로의 마이그레이션을 계획합니다.

이 프롬프트를 사용해 보세요

기본 쿼리 최적화
I have a slow Postgres query. Help me optimize it using best practices from the supabase-postgres-best-practices skill.

My query:
```sql
SELECT * FROM orders WHERE customer_id = 123 AND status = 'pending'
```

Table has 10 million rows. Query takes 5 seconds.
인덱스 전략 검토
Review my indexing strategy for this schema using the supabase-postgres-best-practices skill. Focus on composite indexes, partial indexes, and foreign key indexing.

Schema:
- users table (1M rows)
- orders table (5M rows, foreign key to users)
- Query pattern:经常 filter by user_id + created_at + status
RLS 정책 최적화
I'm implementing Row-Level Security for multi-tenant data using supabase-postgres-best-practices. Help me optimize RLS policies.

Current policy:
```sql
CREATE POLICY user_isolation ON documents
  USING (auth.uid() = user_id)
  WITH CHECK (auth.uid() = user_id);
```

Query performance degraded 5x after enabling RLS.
커넥션 풀링 설정
Help me configure connection pooling for a Node.js application with Supabase using supabase-postgres-best-practices.

Requirements:
- 1000 concurrent users
- Average query time: 50ms
- Using PgBouncer
- Experiencing connection exhaustion errors

Provide specific configuration values and explain trade-offs.

모범 사례

  • 프로덕션 배포 전에 WHERE, JOIN, ORDER BY 칼럼에 항상 인덱스를 생성하세요
  • 대규모 결과 세트의 경우 OFFSET 대신 인덱스된 칼럼으로 커서 기반 페이지네이션을 사용하세요
  • 락 경합을 방지하기 위해 트랜잭션을 짧게 (1 초 미만) 유지하고 트랜잭션 중간에 사용자 상호작용을 피하세요

피하기

  • 특정 칼럼만 필요한 경우 대량의 테이블에서 SELECT * 사용 (불필요한 I/O 를 발생시키고 커버링 인덱스 최적화를 방지함)
  • 행 배칭이나 COPY 사용 대신 루프 내에서 개별 INSERT 문 실행
  • EXPLAIN ANALYZE 로 쿼리 패턴을 분석하지 않고 인덱스 생성 (일부 인덱스는 읽기에 도움이 되지 않고 쓰기 성능을 저하시킬 수 있음)

자주 묻는 질문

어떤 칼럼에 인덱스가 필요한지 어떻게 알 수 있나요?
query-missing-indexes.md 의 누락된 인덱스 쿼리를 사용하여 인덱스가 없는 빈번하게 액세스되는 칼럼을 식별하세요. 느린 쿼리에 EXPLAIN ANALYZE 를 실행하여 순차 스캔을 확인하세요. 애플리케이션 핵심 쿼리에 사용되는 WHERE 및 JOIN 칼럼을 우선순위하세요.
모든 외래 키에 인덱스를 추가해야 하나요?
거의 항상 그렇습니다. schema-foreign-key-indexes.md 에 따르면, 외래 키 인덱스는 JOIN 에 대해 5~20 배 향상을 제공하고 캐스케이딩 DELETE 성능 문제를 방지합니다. 칼럼이 쿼리되거나 조인되지 않는 경우에만 생략하세요.
커서 기반 페이지네이션이 OFFSET 보다 왜 더 나은가요?
OFFSET 는 이전 모든 행을 스캔하고 폐기해야 하므로 페이지가 깊어질수록 느려집니다. 커서 기반 페이지네이션 (인덱스된 WHERE 절 사용) 은 페이지 깊이와 상관없이 O(1) 성능을 가집니다. 구현 예시는 data-pagination.md 를 참조하세요.
Supabase 에 커넥션 풀러가 몇 개 필요한가요?
conn-pooling.md 에 따르면: 트랜잭션 모드에서 PgBouncer 를 사용하세요. 풀 크기는 (애플리케이션 서버 수 × 서버당 커넥션 수) 여야 합니다. 50ms 쿼리로 1000 명의 동시 사용자의 경우, 풀 크기를 20~50 으로 시작하고 소진 오류를 모니터링하세요.
행 수준 보안 (RLS) 이 성능에 영향을 미치나요?
네, RLS 는 정책이 최적이 아닌 경우 2~5 배 오버헤드를 추가할 수 있습니다. security-rls-performance.md 는 정책 칼럼에 인덱스를 사용하고, 정책에 서브쿼리를 피하고, security_invoker 뷰를 사용하도록 설명합니다. 적절히 튜닝된 RLS 정책은 최소 성능 비용으로 보안을 유지합니다.
이 규칙들을 원본 PostgreSQL 에서만 사용할 수 있나요, 아니면 Supabase 에서만 사용 가능한가요?
모든 핵심 규칙은 원본 PostgreSQL 에 적용됩니다. Supabase 특정 참고사항 (커넥션 풀링 기본값, 관리형 RLS) 은 명확하게 표시되어 있습니다. 인덱싱, 쿼리 최적화, 스키마 설계 규칙은 모든 Postgres 14+ 배포에서 동일하게 작동합니다.