Skip to main content
Puri๋Š” ์ง‘๊ณ„, ์ˆ˜์ •, ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ง‘๊ณ„ ์ฟผ๋ฆฌ

groupBy

๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.

distinct

์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. SQL์˜ DISTINCT ์ ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

having

๊ทธ๋ฃนํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ˆ˜์ •

insert

์ƒˆ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

update

๋ ˆ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

delete

๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

increment / decrement

์ˆซ์ž ์ปฌ๋Ÿผ์„ ์ฆ๊ฐ€/๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ–‰ ์ž ๊ธˆ (Row Locking)

ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ SELECTํ•œ ํ–‰์— ์ž ๊ธˆ์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๋™์‹œ ์ˆ˜์ •์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

forUpdate

์„ ํƒ๋œ ํ–‰์— ๋ฐฐํƒ€์  ์ž ๊ธˆ(exclusive lock)์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ํ–‰์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ž ๊ธ€ ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

forShare

์„ ํƒ๋œ ํ–‰์— ๊ณต์œ  ์ž ๊ธˆ(shared lock)์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ํ–‰์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ฝ๊ธฐ๋Š” ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
forUpdate vs forShare:
PostgreSQL MVCC ํ•˜์—์„œ ํ–‰ ์ž ๊ธˆ(FOR UPDATE / FOR SHARE)์€ ์ผ๋ฐ˜ SELECT ์ฝ๊ธฐ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์€ ๊ฐ™์€ ํ–‰์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ž ๊ธˆ ์š”์ฒญ๊ณผ ์ˆ˜์ • ์ž‘์—…์ž…๋‹ˆ๋‹ค.
forUpdate()์™€ forShare()๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์—†์ด ์‚ฌ์šฉํ•˜๋ฉด ์ž ๊ธˆ์ด ์ฆ‰์‹œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ

first

์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

pluck

ํŠน์ • ์ปฌ๋Ÿผ ๊ฐ’๋“ค๋งŒ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰

vectorSimilarity

pgvector๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์ž…๋‹ˆ๋‹ค.
์˜ต์…˜:
  • method: ์œ ์‚ฌ๋„ ์ธก์ • ๋ฐฉ์‹
    • cosine: ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ (0~1, ๋†’์„์ˆ˜๋ก ์œ ์‚ฌ)
    • l2: ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ (๋‚ฎ์„์ˆ˜๋ก ์œ ์‚ฌ)
    • inner_product: ๋‚ด์  (๋†’์„์ˆ˜๋ก ์œ ์‚ฌ)
  • threshold: ์œ ์‚ฌ๋„ ํ•„ํ„ฐ๋ง ๊ธฐ์ค€๊ฐ’
  • distinctOn: ํŠน์ • ์ปฌ๋Ÿผ ๊ฐ’๋ณ„๋กœ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ ํ•˜๋‚˜์”ฉ๋งŒ ๋ฐ˜ํ™˜

distinctOn ์˜ต์…˜

distinctOn ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์ปฌ๋Ÿผ ๊ฐ’๋ณ„๋กœ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์”ฉ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PostgreSQL์˜ DISTINCT ON ์ ˆ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
distinctOn๊ณผ threshold๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
distinctOn ์˜ต์…˜ ์‚ฌ์šฉ ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๊ฐ์‹ธ์ง€๋ฉฐ, ์™ธ๋ถ€์—์„œ similarity ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

Upsert (INSERT or UPDATE)

onConflict

์ถฉ๋Œ ์‹œ ๋™์ž‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

returning

์‚ฝ์ž…/์—…๋ฐ์ดํŠธ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ

clone

์ฟผ๋ฆฌ๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

debug

์ƒ์„ฑ๋œ SQL์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

toQuery

SQL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

raw

Raw SQL์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ „ ์˜ˆ์‹œ

์„ฑ๋Šฅ ์ตœ์ ํ™”

๋ฐฐ์น˜ INSERT

increment vs UPDATE

HAVING vs WHERE

์ฃผ์˜์‚ฌํ•ญ

1. increment/decrement ๊ฐ’

2. onConflict ์ œ์•ฝ์กฐ๊ฑด

3. returning์€ PostgreSQL๋งŒ

4. vectorSimilarity๋Š” pgvector ํ•„์š”

๋‹ค์Œ ๋‹จ๊ณ„

select

์กฐํšŒํ•  ํ•„๋“œ ์„ ํƒํ•˜๊ธฐ

where

์กฐ๊ฑด ํ•„ํ„ฐ๋งํ•˜๊ธฐ

UpsertBuilder

๋Œ€๋Ÿ‰ Upsert ์ฒ˜๋ฆฌํ•˜๊ธฐ

Transactions

ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉํ•˜๊ธฐ