Supabase Postgres Best Practices
Comprehensive performance optimization guide for Postgres, maintained by Supabase. Contains rules across 8 categories, prioritized by impact to guide automated query optimization and schema design.
When to Apply
Reference these guidelines when:
- Writing SQL queries or designing schemas
- Implementing indexes or query optimization
- Reviewing database performance issues
- Configuring connection pooling or scaling
- Optimizing for Postgres-specific features
- Working with Row-Level Security (RLS)
Rule Categories by Priority
| Priority |
Category |
Impact |
Prefix |
| 1 |
Query Performance |
CRITICAL |
query- |
| 2 |
Connection Management |
CRITICAL |
conn- |
| 3 |
Security & RLS |
CRITICAL |
security- |
| 4 |
Schema Design |
HIGH |
schema- |
| 5 |
Concurrency & Locking |
MEDIUM-HIGH |
lock- |
| 6 |
Data Access Patterns |
MEDIUM |
data- |
| 7 |
Monitoring & Diagnostics |
LOW-MEDIUM |
monitor- |
| 8 |
Advanced Features |
LOW |
advanced- |
How to Use
Read individual rule files for detailed explanations and SQL examples:
references/query-missing-indexes.md
references/query-partial-indexes.md
references/_sections.md
Each rule file contains:
- Brief explanation of why it matters
- Incorrect SQL example with explanation
- Correct SQL example with explanation
- Optional EXPLAIN output or metrics
- Additional context and references
- Supabase-specific notes (when applicable)
References
Review Workflow
Select only the rule files that match the task. Start with correctness and
access control, then measure performance before proposing tuning changes.
- Identify the database version, hosting constraints, workload shape, and
whether the task changes data or only reviews SQL.
- Read the relevant
query-, conn-, security-, schema-, lock-,
data-, or monitor- references; avoid loading the full rule set by default.
- Preserve existing RLS and privilege boundaries. Treat disabling RLS,
broadening grants, destructive DDL, and production writes as separate,
explicitly authorized actions.
- For performance claims, capture the query shape and an
EXPLAIN or
EXPLAIN (ANALYZE, BUFFERS) result in a safe environment. Do not infer an
improvement from the presence of an index alone.
- Verify migrations on a representative schema, including rollback or a
forward-fix path, lock duration, and compatibility with concurrent traffic.
Acceptance Evidence
- Query tuning: compare plans and measured latency or buffer usage under the
same parameters and representative data distribution.
- Index changes: confirm intended scans use the index and account for write,
storage, and maintenance overhead.
- RLS or privilege changes: test allowed and denied paths with the actual roles;
service-role success is not proof that end-user policies work.
- Connection changes: verify pool mode, transaction semantics, prepared
statement compatibility, connection limits, and saturation behavior.
- Schema changes: verify constraints, backfill behavior, lock exposure, and the
recovery procedure before production rollout.
Boundaries
- Never run
EXPLAIN ANALYZE on a mutating statement in production without an
explicitly safe transaction and authorization; plain EXPLAIN is the safer
default for uncertain statements.
- Do not present generic PostgreSQL advice as a Supabase platform guarantee.
- Static SQL review and local tests do not prove production capacity, failover,
replication health, or zero-downtime migration behavior.
1---2name: supabase-postgres-best-practices3description: Use when writing or reviewing Postgres schemas, queries, indexes, RLS policies, connection settings, or migrations with Supabase guidance; applicable to Postgres on any hosting platform.4license: MIT5---6
7# Supabase Postgres Best Practices
8
9Comprehensive performance optimization guide for Postgres, maintained by Supabase. Contains rules across 8 categories, prioritized by impact to guide automated query optimization and schema design.
10
11## When to Apply
12
13Reference these guidelines when:
14- Writing SQL queries or designing schemas
15- Implementing indexes or query optimization
16- Reviewing database performance issues
17- Configuring connection pooling or scaling
18- Optimizing for Postgres-specific features
19- Working with Row-Level Security (RLS)
20
21## Rule Categories by Priority
22
23| Priority | Category | Impact | Prefix |
24|----------|----------|--------|--------|
25| 1 | Query Performance | CRITICAL | `query-` |
26| 2 | Connection Management | CRITICAL | `conn-` |
27| 3 | Security & RLS | CRITICAL | `security-` |
28| 4 | Schema Design | HIGH | `schema-` |
29| 5 | Concurrency & Locking | MEDIUM-HIGH | `lock-` |
30| 6 | Data Access Patterns | MEDIUM | `data-` |
31| 7 | Monitoring & Diagnostics | LOW-MEDIUM | `monitor-` |
32| 8 | Advanced Features | LOW | `advanced-` |
33
34## How to Use
35
36Read individual rule files for detailed explanations and SQL examples:
37
38```
39references/query-missing-indexes.md
40references/query-partial-indexes.md
41references/_sections.md
42```
43
44Each rule file contains:
45- Brief explanation of why it matters
46- Incorrect SQL example with explanation
47- Correct SQL example with explanation
48- Optional EXPLAIN output or metrics
49- Additional context and references
50- Supabase-specific notes (when applicable)
51
52## References
53
54- https://www.postgresql.org/docs/current/
55- https://supabase.com/docs
56- https://wiki.postgresql.org/wiki/Performance_Optimization
57- https://supabase.com/docs/guides/database/overview
58- https://supabase.com/docs/guides/auth/row-level-security
59<!-- LOCAL-QUALITY-SUPPLEMENT:START -->
60## Review Workflow
61
62Select only the rule files that match the task. Start with correctness and
63access control, then measure performance before proposing tuning changes.
64
651. Identify the database version, hosting constraints, workload shape, and
66 whether the task changes data or only reviews SQL.
672. Read the relevant `query-`, `conn-`, `security-`, `schema-`, `lock-`,
68 `data-`, or `monitor-` references; avoid loading the full rule set by default.
693. Preserve existing RLS and privilege boundaries. Treat disabling RLS,
70 broadening grants, destructive DDL, and production writes as separate,
71 explicitly authorized actions.
724. For performance claims, capture the query shape and an `EXPLAIN` or
73 `EXPLAIN (ANALYZE, BUFFERS)` result in a safe environment. Do not infer an
74 improvement from the presence of an index alone.
755. Verify migrations on a representative schema, including rollback or a
76 forward-fix path, lock duration, and compatibility with concurrent traffic.
77
78## Acceptance Evidence
79
80- Query tuning: compare plans and measured latency or buffer usage under the
81 same parameters and representative data distribution.
82- Index changes: confirm intended scans use the index and account for write,
83 storage, and maintenance overhead.
84- RLS or privilege changes: test allowed and denied paths with the actual roles;
85 service-role success is not proof that end-user policies work.
86- Connection changes: verify pool mode, transaction semantics, prepared
87 statement compatibility, connection limits, and saturation behavior.
88- Schema changes: verify constraints, backfill behavior, lock exposure, and the
89 recovery procedure before production rollout.
90
91## Boundaries
92
93- Never run `EXPLAIN ANALYZE` on a mutating statement in production without an
94 explicitly safe transaction and authorization; plain `EXPLAIN` is the safer
95 default for uncertain statements.
96- Do not present generic PostgreSQL advice as a Supabase platform guarantee.
97- Static SQL review and local tests do not prove production capacity, failover,
98 replication health, or zero-downtime migration behavior.
99<!-- LOCAL-QUALITY-SUPPLEMENT:END -->