ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต - ๊ณ ๊ธ SQL๊ณผ ์ธ๋ฑ์ค ์ต์ ํ
octo54 2025. 3. 8. 18:23๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต
2.2 ๊ณ ๊ธ SQL๊ณผ ์ธ๋ฑ์ค ์ต์ ํ
PostgreSQL์์ ๊ธฐ๋ณธ SQL์ ์ตํ๋ค๋ฉด, ์ด์ ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๊ณ ๊ธ SQL ๊ธฐ๋ฒ์ ๋ฐฐ์์ผ ํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ JOIN, ์๋ธ์ฟผ๋ฆฌ, ์๋์ฐ ํจ์ ๋ฑ ๊ณ ๊ธ SQL ๊ธฐ๋ฅ๊ณผ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
2.2.1 ๊ณ ๊ธ SQL ๊ฐ์
SQL์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ๊ณ ,
๋ณต์กํ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์์ต๋๋ค.
โ ์ด๋ฒ ๊ธ์์ ๋ค๋ฃฐ ๋ด์ฉ
๐น JOIN (์กฐ์ธ)๊ณผ ์๋ธ์ฟผ๋ฆฌ
๐น ์๋์ฐ ํจ์(Window Functions)
๐น ์ธ๋ฑ์ค(Index) ํ์ฉ ๋ฐ ์ต์ ํ
๐น ์ฟผ๋ฆฌ ์คํ ๊ณํ ๋ถ์ (EXPLAIN ANALYZE)
2.2.2 JOIN๊ณผ ์๋ธ์ฟผ๋ฆฌ ํ์ฉ
PostgreSQL์์๋ JOIN(์กฐ์ธ) ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
๋ํ ์๋ธ์ฟผ๋ฆฌ(Subquery) ๋ฅผ ํ์ฉํ๋ฉด ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๐น INNER JOIN (๋ด๋ถ ์กฐ์ธ)
INNER JOIN์ ๋ ํ ์ด๋ธ์์ ๊ณตํต๋ ๋ฐ์ดํฐ๋ง ๋ฐํํฉ๋๋ค.
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
โ users ํ ์ด๋ธ๊ณผ orders ํ ์ด๋ธ์ id์ user_id ๊ธฐ์ค์ผ๋ก ์กฐ์ธ
๐น LEFT JOIN (์ผ์ชฝ ์กฐ์ธ)
LEFT JOIN์ ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ฉฐ, ์ผ์นํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ NULL์ ๋ฐํํฉ๋๋ค.
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
๐น ์๋ธ์ฟผ๋ฆฌ (Subquery) ํ์ฉ
์๋ธ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ ์์์ ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋ฐฉ์์ ๋๋ค.
SELECT name, email
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
โ 100๋ฌ๋ฌ ์ด์ ์ฃผ๋ฌธํ ์ฌ์ฉ์๋ง ์กฐํ
2.2.3 ์๋์ฐ ํจ์(Window Functions)
์๋์ฐ ํจ์๋ ํ(row) ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋์ ํฉ๊ณ, ์์, ์ด๋ ํ๊ท ๋ฑ์ ๊ณ์ฐํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๐น RANK()์ DENSE_RANK()
RANK()์ DENSE_RANK()๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์์๋ฅผ ๋งค๊น๋๋ค.
SELECT name, amount,
RANK() OVER (ORDER BY amount DESC) AS ranking,
DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_ranking
FROM orders;
๐น SUM() OVER()๋ฅผ ํ์ฉํ ๋์ ํฉ๊ณ
SUM() OVER()๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ๊ทธ๋ฃน ๋ด์์ ๋์ ํฉ๊ณ๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
SELECT name, amount,
SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at) AS running_total
FROM orders;
โ PARTITION BY๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ณ ๋์ ํฉ๊ณ๋ฅผ ๊ณ์ฐ
2.2.4 ์ธ๋ฑ์ค(Index) ํ์ฉ ๋ฐ ์ต์ ํ
๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ์ธ๋ฑ์ค๊ฐ ํ์์ ์
๋๋ค.
PostgreSQL์์๋ B-TREE, HASH, GIN, GiST, BRIN ๋ฑ ๋ค์ํ ์ธ๋ฑ์ค๋ฅผ ์ง์ํฉ๋๋ค.
๐น ๊ธฐ๋ณธ B-TREE ์ธ๋ฑ์ค ์์ฑ
PostgreSQL์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ธ๋ฑ์ค๋ B-TREE ์ธ๋ฑ์ค์ ๋๋ค.
CREATE INDEX idx_users_email ON users(email);
โ email ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์ฌ ๊ฒ์ ์๋๋ฅผ ํฅ์
๐น HASH ์ธ๋ฑ์ค (๊ณ ์ ๊ฐ ๊ฒ์ ์ต์ ํ)
ํด์ ์ธ๋ฑ์ค๋ ๊ณ ์ ํ ๊ฐ ๊ฒ์์ ์ต์ ํ๋์ด ์์ต๋๋ค.
CREATE INDEX idx_users_id ON users USING HASH (id);
โ USING HASH๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑ
๐น GIN ์ธ๋ฑ์ค (JSON, ๋ฐฐ์ด ๊ฒ์ ์ต์ ํ)
PostgreSQL์ JSON, ๋ฐฐ์ด ๋ฑ์ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ ์ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ๊ธฐ ์ํด GIN ์ธ๋ฑ์ค๋ฅผ ์ง์ํฉ๋๋ค.
CREATE INDEX idx_users_json ON users USING GIN (jsonb_column);
โ JSONB ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ ๊ฐ๋ฅ
2.2.5 EXPLAIN ANALYZE๋ฅผ ํ์ฉํ ์ฟผ๋ฆฌ ์ต์ ํ
PostgreSQL์์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋ถ์ํ๊ณ ์ต์ ํํ๋ ค๋ฉด EXPLAIN ANALYZE๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
๐น ์คํ ๊ณํ ํ์ธ (EXPLAIN)
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
โ ์คํ ๊ณํ์ ํ์ธํ์ฌ ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋๋์ง ํ์ธ
๐น ์คํ ์๊ฐ ๋ถ์ (EXPLAIN ANALYZE)
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
โ ์คํ ์๊ฐ๊ณผ ์ค์ ์ฑ๋ฅ์ ๋ถ์ํ์ฌ ์ฟผ๋ฆฌ ์ต์ ํ ๊ฐ๋ฅ
2.2.6 ๊ฒฐ๋ก : ๊ณ ๊ธ SQL์ ํ์ฉํ ์ฑ๋ฅ ์ต์ ํ
โ
JOIN๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์กฐ์ ๊ฐ๋ฅ
โ
์๋์ฐ ํจ์(Window Functions)๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ๋ถ์ ๊ธฐ๋ฅ ์ ๊ณต
โ
์ธ๋ฑ์ค(Index)๋ฅผ ์ ์ ํ ํ์ฉํ๋ฉด ๊ฒ์ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋จ
โ
EXPLAIN ANALYZE๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ๊ณํ์ ๋ถ์ํ๊ณ ์ต์ ํ ๊ฐ๋ฅ
์ด์ PostgreSQL์์ ๊ณ ๊ธ SQL์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ตํ์ต๋๋ค!
๋ค์ ๊ธ์์๋ ํธ๋์ญ์
๊ณผ ๋์์ฑ ์ ์ด๋ฅผ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๐
๐ ๋ค์ ๊ธ ์๊ณ : ํธ๋์ญ์ ๊ณผ ๋์์ฑ ์ ์ด
๐ ๋ค์ ํธ: 2.3 ํธ๋์ญ์ ๊ณผ ๋์์ฑ ์ ์ด
์ด์ PostgreSQL์ ๊ณ ๊ธ SQL๊ณผ ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ๊ธ์ด ์์ฑ๋์์ต๋๋ค!
๋ค์ ๊ธ์์๋ ํธ๋์ญ์
๊ณผ ๋์์ฑ ์ ์ด๋ฅผ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๐๐
'study > postgresql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- REACT
- Next.js
- LangChain
- ๋ฐฑ์๋๊ฐ๋ฐ
- rag
- ๋ฆฌ์กํธ
- nextJS
- Docker
- ๋ฐฑ์๋
- PostgreSQL
- kotlin
- Python
- llm
- babel
- ํ์ด์ง
- Page
- AI์ฑ๋ด
- til
- ๋ก์ปฌLLM
- ๊ด๋ฆฌ์
- fastapi
- ์น๊ฐ๋ฐ
- Webpack
- ์ฑ๋ด๊ฐ๋ฐ
- nodejs
- Project
- github
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- ํ๋ก ํธ์๋
- Ktor
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |