| name | postgres-perf |
| description | PostgreSQL performance optimization and best practices. Use when writing SQL queries, designing schemas, implementing indexes, or debugging database performance. Covers query optimization, connection management, schema design, and RLS. |
| metadata | {"author":"misskim","version":"1.0","origin":"Concept from Supabase postgres-best-practices, distilled for our use"} |
PostgreSQL Performance
DB ์ฟผ๋ฆฌ/์คํค๋ง ์์ฑ ์ ์ฑ๋ฅ ์ต์ ํ ๊ฐ์ด๋.
์ฐ์ ์์๋ณ ํต์ฌ ๊ท์น
๐ด CRITICAL: ์ฟผ๋ฆฌ ์ฑ๋ฅ
SELECT * FROM orders WHERE customer_email = 'user@example.com';
CREATE INDEX idx_orders_email ON orders(customer_email);
- EXPLAIN ANALYZE ์ต๊ดํ โ ์คํ ๊ณํ ํญ์ ํ์ธ
- Seq Scan์ด ํฐ ํ
์ด๋ธ์ ๋ํ๋๋ฉด ์ธ๋ฑ์ค ํ์
SELECT * ๊ธ์ง โ ํ์ํ ์ปฌ๋ผ๋ง ์ ํ
- N+1 ์ฟผ๋ฆฌ โ JOIN ๋๋ ๋ฐฐ์น ์กฐํ๋ก ๊ต์ฒด
๐ด CRITICAL: ์ปค๋ฅ์
๊ด๋ฆฌ
- ์ปค๋ฅ์
ํ ์ฌ์ฉ (์ง์ ์ฐ๊ฒฐ ๊ธ์ง)
- Supabase โ pgBouncer (transaction mode)
- ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ โ ์ปค๋ฅ์
ํ ํ์
- ์ ํด ์ปค๋ฅ์
์ ๋ฆฌ
๐ก HIGH: ์คํค๋ง ์ค๊ณ
CREATE INDEX idx_everything ON orders(a, b, c, d, e);
CREATE INDEX idx_active_orders ON orders(created_at)
WHERE status = 'active';
- ์ ๊ทํ vs ๋น์ ๊ทํ โ ์ฝ๊ธฐ ํจํด์ ๋ง๊ฒ ๊ฒฐ์
- UUID vs serial โ UUID๊ฐ ๋ถ์ฐ ํ๊ฒฝ์ ์ ๋ฆฌํ๋ ์ธ๋ฑ์ค ํฌ๊ธฐ ํผ
- JSONB โ ๊ตฌ์กฐํ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ง, ์ฟผ๋ฆฌ ๋์์ด๋ฉด ์ปฌ๋ผ์ผ๋ก
๐ข MEDIUM: ๋์์ฑ/์ ๊ธ
- ๋๋ UPDATE/DELETE โ ๋ฐฐ์น ์ฒ๋ฆฌ
SELECT ... FOR UPDATE โ ํ์ํ ํ๋ง ์ ๊ธ
- ํธ๋์ญ์
์ต์ํ (์งง๊ฒ ์ ์ง)
- ๋ฐ๋๋ฝ ๋ฐฉ์ง โ ์ผ๊ด๋ ์ ๊ธ ์์
๐ต LOW: RLS (Row Level Security)
CREATE POLICY user_data ON user_profiles
FOR SELECT USING (auth.uid() = user_id);
- RLS ์ ์ฑ
์ ์ธ๋ฑ์ค์ ํจ๊ป ์ค๊ณ (์ฑ๋ฅ ์ํฉํธ!)
auth.uid() ํธ์ถ ์ต์ํ
- ๋ณต์กํ ์ ์ฑ
โ EXPLAIN์ผ๋ก ์ฑ๋ฅ ํ์ธ
์ค๋ฌด ํ
- ๊ฐ๋ฐ ์ค:
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
- ํ๋ก๋์
: ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ ํ์ฑํ
- ๋ง์ด๊ทธ๋ ์ด์
: ๋์ฉ๋ ํ
์ด๋ธ ALTER๋ ๋น๋๊ธฐ๋ก
- ๋ฐฑ์
: NAS์ pg_dump ์๋ํ ๊ฐ๋ฅ