PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋งŽ์€ ๋ถ„๋“ค์ด explain.tensor.ru - PostgreSQL ๊ณ„ํš ์‹œ๊ฐํ™” ์„œ๋น„์Šค๋Š” ์ฝ๊ธฐ ์–ด๋ ค์šด ์„œ๋ฒ„ ๋กœ๊ทธ ๋ถ€๋ถ„์„ ๋ฐ”๊พธ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
... ํ•ด๋‹น ๊ณ„ํš ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ƒํ™ฉ๋ณ„ ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ฆ„๋‹ต๊ฒŒ ๋””์ž์ธ๋œ ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
๊ทธ์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ์‚ฌ๋ณธ์—์„œ PGConf.Russia 2020์—์„œ ๋ณด๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด ์ผ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ์™€ ๊ทธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฌ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ๊ธฐ๋ก์€ ๊ธฐ์‚ฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋ณ‘๋“  SQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ ˆ์‹œํ”ผ".



๋จผ์ € ์ฑ„์ƒ‰์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ณ„ํš์„ ์ฑ„์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ์ฑ„์ƒ‰ํ–ˆ์œผ๋ฉฐ ์ด๋ฏธ ์•„๋ฆ„๋‹ต๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹์ด ์ง€์ •๋˜์ง€ ์•Š์€ "์‹œํŠธ"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์—์„œ ๊ฐ€์ ธ์˜จ ์š”์ฒญ์€ ๋งค์šฐ ๋ณด๊ธฐ ํ‰ํ•˜๊ณ  ๋”ฐ๋ผ์„œ ๋ถˆํŽธํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

ํŠนํžˆ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์˜ ์š”์ฒญ ๋ณธ๋ฌธ์„ ํ•œ ์ค„์— "์ ‘์ฐฉ"ํ•˜๋Š” ๊ฒฝ์šฐ(๋ฌผ๋ก  ์•ˆํ‹ฐํŒจํ„ด์ด์ง€๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค). ๋”์ฐํ•ด!

์ข€ ๋” ์•„๋ฆ„๋‹ต๊ฒŒ ๊ทธ๋ ค๋ณด์ž.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์•„๋ฆ„๋‹ต๊ฒŒ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ฆ‰ ์š”์ฒญ ๋ณธ๋ฌธ์„ ๋ถ„ํ•ดํ•˜๊ณ  ๋‹ค์‹œ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ์š”์ฒญ์˜ ๊ฐ ๊ฐœ์ฒด์— ํžŒํŠธ(๊ณ„ํš์˜ ํ•ด๋‹น ์ง€์ ์—์„œ ๋ฐœ์ƒํ•œ ์ผ)๋ฅผ "์ฒจ๋ถ€"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์ฒญ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์€ NodeJS์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค., ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฅผ ์œ„ํ•œ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. GitHub์—์„œ ์ฐพ์•„๋ณด์„ธ์š”. ์‹ค์ œ๋กœ ์ด๋Š” PostgreSQL ํŒŒ์„œ ์ž์ฒด์˜ ๋‚ด๋ถ€๋กœ ํ™•์žฅ๋œ "๋ฐ”์ธ๋”ฉ"์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌธ๋ฒ•์€ ๋‹จ์ˆœํžˆ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  NodeJS์—์„œ ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ชจ๋“ˆ์„ ๊ธฐ์ดˆ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํฐ ๋น„๋ฐ€์ด ์—†์Šต๋‹ˆ๋‹ค.

์š”์ฒญ ๋ณธ๋ฌธ์„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์—์„œ โ€‹โ€‹JSON ๊ฐœ์ฒด ํ˜•์‹์˜ ๊ตฌ๋ฌธ ๋ถ„์„๋œ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์›ํ•˜๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ, ์ƒ‰์ƒ ๋ฐ ์„œ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”, ๋งž์ถค ์„ค์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ด๊ฒƒ์ด ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ฟผ๋ฆฌ ๋ฐ ๊ณ„ํš ๋…ธ๋“œ ๋งคํ•‘

์ด์ œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ๋ถ„์„ํ•œ ๊ณ„ํš๊ณผ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ๋ถ„์„ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. CTE๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๋‘ ๋ฒˆ ์ฝ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๊ทธ๋Ÿฌํ•œ ๊ณ„ํš์„ ์„ธ์›๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

CTE

์ž˜ ๋ณด๋ฉด ๋ฒ„์ „ 12๊นŒ์ง€(ํ˜น์€ ๊ทธ๊ฒƒ๋ถ€ํ„ฐ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•ด์„œ) MATERIALIZED) ํ˜•์„ฑ CTE๋Š” ๊ธฐํš์ž์—๊ฒŒ ์ ˆ๋Œ€์ ์ธ ์žฅ๋ฒฝ์ž…๋‹ˆ๋‹ค..
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ฆ‰, ์š”์ฒญ ์–ด๋”˜๊ฐ€์— CTE ์ƒ์„ฑ์ด ์žˆ๊ณ  ๊ณ„ํš ์–ด๋”˜๊ฐ€์— ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ CTE, ๊ทธ๋Ÿฌ๋ฉด ์ด๋“ค ๋…ธ๋“œ๋Š” ํ™•์‹คํžˆ ์„œ๋กœ "์‹ธ์›€"ํ•˜๋ฏ€๋กœ ์ฆ‰์‹œ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„ํ‘œ ๋ฌธ์ œ: CTE๋Š” ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
์ค‘์ฒฉ์ด ๋งค์šฐ ๋ถˆ๋Ÿ‰ํ•˜๊ณ  ์‹ฌ์ง€์–ด ๊ฐ™์€ ์ด๋ฆ„์˜ ๊ฒƒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CTE A ~์„ํ•˜๋‹ค CTE X, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ถ€๋„ ๊ฐ™์€ ์ˆ˜์ค€์— ์žˆ์Šต๋‹ˆ๋‹ค CTE B ๋‹ค์‹œ ํ•  CTE X:

WITH A AS (
  WITH X AS (...)
  SELECT ...
)
, B AS (
  WITH X AS (...)
  SELECT ...
)
...

๋น„๊ตํ•  ๋•Œ ์ด๊ฒƒ์„ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ โ€œ๋ˆˆ์œผ๋กœโ€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ, ์‹ฌ์ง€์–ด ๊ณ„ํš์„ ๋ณด๋Š” ๊ฒƒ, ์‹ฌ์ง€์–ด ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ ๋ณด๋Š” ๊ฒƒ์กฐ์ฐจ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. CTE ์ƒ์„ฑ์ด ๋ณต์žกํ•˜๊ณ  ์ค‘์ฒฉ๋˜์–ด ์žˆ์œผ๋ฉฐ ์š”์ฒญ์ด ํฌ๋‹ค๋ฉด ์™„์ „ํžˆ ๋ฌด์˜์‹์ ์ž…๋‹ˆ๋‹ค.

UNION

๊ฒ€์ƒ‰์–ด์— ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ UNION [ALL] (๋‘ ์ƒ˜ํ”Œ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ์ž) ๊ณ„ํš์—์„œ๋Š” ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Append, ๋˜๋Š” ์ผ๋ถ€ Recursive Union.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์œ„์˜ "์œ„"์— ์žˆ๋Š” ๊ฒƒ UNION - ์ด๊ฒƒ์€ "์•„๋ž˜"์— ์žˆ๋Š” ์šฐ๋ฆฌ ๋…ธ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์†์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ†ต๊ณผํ•œ๋‹ค๋ฉด UNION ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ธ”๋ก์„ "์ ‘์ฐฉ"ํ•œ ๋‹ค์Œ Append-์—ฌ์ „ํžˆ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ์žˆ์ง€๋งŒ ๋‘ ๊ฐœ๊ฐ€ ์•„๋‹Œ ๋งŽ์€ ์ž์‹์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์ˆœ์„œ๋Œ€๋กœ:

  (...) -- #1
UNION ALL
  (...) -- #2
UNION ALL
  (...) -- #3

Append
  -> ... #1
  -> ... #2
  -> ... #3

๋ณ„ํ‘œ ๋ฌธ์ œ: ๋‚ด๋ถ€ ์žฌ๊ท€ ์ƒ˜ํ”Œ๋ง ์ƒ์„ฑ(WITH RECURSIVE)์€ ๋‘˜ ์ด์ƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. UNION. ๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก ๋‹ค์Œ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก๋งŒ ํ•ญ์ƒ ์žฌ๊ท€์ ์ž…๋‹ˆ๋‹ค. UNION. ์œ„์˜ ๋ชจ๋“  ๊ฒƒ์€ ํ•˜๋‚˜์ด์ง€๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. UNION:

WITH RECURSIVE T AS(
  (...) -- #1
UNION ALL
  (...) -- #2, ั‚ัƒั‚ ะบะพะฝั‡ะฐะตั‚ัั ะณะตะฝะตั€ะฐั†ะธั ัั‚ะฐั€ั‚ะพะฒะพะณะพ ัะพัั‚ะพัะฝะธั ั€ะตะบัƒั€ัะธะธ
UNION ALL
  (...) -- #3, ั‚ะพะปัŒะบะพ ัั‚ะพั‚ ะฑะปะพะบ ั€ะตะบัƒั€ัะธะฒะฝั‹ะน ะธ ะผะพะถะตั‚ ัะพะดะตั€ะถะฐั‚ัŒ ะพะฑั€ะฐั‰ะตะฝะธะต ะบ T
)
...

๋˜ํ•œ ๊ทธ๋Ÿฌํ•œ ์˜ˆ๋ฅผ "๋‹๋ณด์ด๊ฒŒ" ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ์šฐ๋ฆฌ๋Š” UNION-์š”์ฒญ์—๋Š” 3๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ UNION ์ผ์น˜ Append-๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ - Recursive Union.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๋ฐ์ดํ„ฐ ์ฝ๊ธฐ-์“ฐ๊ธฐ

๋ชจ๋“  ๊ฒƒ์ด ์ค€๋น„๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด์ œ ์š”์ฒญ์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ๊ณ„ํš์˜ ์–ด๋Š ๋ถ€๋ถ„์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ž‘ํ’ˆ๋“ค ์†์—์„œ ์šฐ๋ฆฌ๋Š” '์ฝ์„ ์ˆ˜ ์žˆ๋Š”' ๋Œ€์ƒ์„ ์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๊ด€์ ์—์„œ๋Š” ํ…Œ์ด๋ธ”์ธ์ง€ CTE์ธ์ง€๋Š” ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ๋™์ผํ•œ ๋…ธ๋“œ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. RangeVar. ๊ทธ๋ฆฌ๊ณ  "๊ฐ€๋…์„ฑ" ์ธก๋ฉด์—์„œ ์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ์ œํ•œ๋œ ๋…ธ๋“œ ์ง‘ํ•ฉ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

  • Seq Scan on [tbl]
  • Bitmap Heap Scan on [tbl]
  • Index [Only] Scan [Backward] using [idx] on [tbl]
  • CTE Scan on [cte]
  • Insert/Update/Delete on [tbl]

์šฐ๋ฆฌ๋Š” ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ๊ณ , ๋ธ”๋ก์˜ ๋Œ€์‘ ๊ด€๊ณ„๋ฅผ ์•Œ๊ณ , ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋Œ€์ผ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๋‹ค์‹œ "๋ณ„ํ‘œ๊ฐ€ ์žˆ๋Š”" ์ž‘์—…. ์š”์ฒญ์„ ๋ฐ›์•„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„์นญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ CTE์—์„œ ๋‘ ๋ฒˆ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์šฐ๋ฆฌ๋Š” ๊ณ„ํš์„ ๋ด…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์™œ ๋ณ„์นญ์ด ์ƒ๊ฒผ๋‚˜์š”? ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ฃผ๋ฌธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ "์ˆซ์ž ๋ฒˆํ˜ธ"๋Š” ์–ด๋””์„œ ์–ป์Šต๋‹ˆ๊นŒ?

PostgreSQL์€ ์ด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋งŒ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค ๊ทธ๋ƒฅ ๊ทธ๋Ÿฐ ๋ณ„์นญ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ณ„ํš๊ณผ์˜ ๋น„๊ต ๋ชฉ์ ์ƒ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ ๋‹จ์ˆœํžˆ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ๋žŒ์—๊ฒŒ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์ด์ง€ ๋ง์ž.

์ดˆ "๋ณ„ํ‘œ๊ฐ€ ์žˆ๋Š”" ์ž‘์—…: ๋ถ„ํ• ๋œ ํ…Œ์ด๋ธ”์—์„œ ์ฝ๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. Append ๋˜๋Š” Merge Append, ์ด๋Š” ๋งŽ์€ ์ˆ˜์˜ "์–ด๋ฆฐ์ด"๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ฐ๊ฐ์€ ์–ด๋–ป๊ฒŒ ๋“  Scan'om ํ…Œ์ด๋ธ” ์„น์…˜์—์„œ : Seq Scan, Bitmap Heap Scan ๋˜๋Š” Index Scan. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์ด๋Ÿฌํ•œ "ํ•˜์œ„"๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Append ะฟั€ะธ UNION.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๊ทธ๋Ÿฌํ•œ ๋งค๋“ญ์„ ์ดํ•ดํ•˜๊ณ  "ํ•œ ๋”๋ฏธ๋กœ" ๋ชจ์•„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.๋ฉ”๊ฐ€ํ…Œ์ด๋ธ”์—์„œ ์ฝ์€ ๋ชจ๋“  ๋‚ด์šฉ์€ ์—ฌ๊ธฐ ํŠธ๋ฆฌ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.".

"๊ฐ„๋‹จํ•œ" ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋…ธ๋“œ

PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

Values Scan ๊ณ„ํš์— ํ•ด๋‹น VALUES ์š”์ฒญ์—.

Result ์—†๋Š” ์š”์ฒญ์ž…๋‹ˆ๋‹ค FROM ~์ฒ˜๋Ÿผ SELECT 1. ํ˜น์€ ์˜๋„์ ์œผ๋กœ ๊ฑฐ์ง“ ํ‘œํ˜„์„ ํ–ˆ์„ ๋•Œ WHERE-block(๊ทธ๋Ÿฌ๋ฉด ์†์„ฑ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. One-Time Filter):

EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- ะธะปะธ 0 = 1

Result  (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
  One-Time Filter: false

Function Scan ๋™์ผํ•œ ์ด๋ฆ„์˜ SRF์— "๋งคํ•‘"ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ค‘์ฒฉ๋œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์ฟผ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๋€Œ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. InitPlan/SubPlan. ๋•Œ๋•Œ๋กœ ๊ทธ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ... Join ๋˜๋Š” ... Anti Join, ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์“ธ ๋•Œ WHERE NOT EXISTS .... ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ๊ทธ๊ฒƒ๋“ค์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ณ„ํš์˜ ํ…์ŠคํŠธ์—๋Š” ๊ณ„ํš์˜ ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ "๋ณ„ํ‘œ๊ฐ€ ์žˆ๋Š”" ์ž‘์—…: ์ผ๋ถ€ VALUES ์š”์ฒญ์—. ์ด ๊ฒฝ์šฐ์™€ ๊ณ„ํš์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Values Scan.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

"๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„" ์ ‘๋ฏธ์‚ฌ๋Š” ์„œ๋กœ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ ‘๋ฏธ์‚ฌ๋Š” ํ•ด๋‹น ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. VALUES-์š”์ฒญ์„ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

์š”์ฒญ ๋‚ด์šฉ์ด ๋ชจ๋‘ ์ •๋ฆฌ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚จ์€ ๊ฒƒ์€ Limit.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Limit, Sort, Aggregate, WindowAgg, Unique ์š”์ฒญ์˜ ํ•ด๋‹น ์—ฐ์‚ฐ์ž(์žˆ๋Š” ๊ฒฝ์šฐ)์— ์ผ๋Œ€์ผ๋กœ "๋งคํ•‘"ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” "๋ณ„"์ด๋‚˜ ์–ด๋ ค์›€์ด ์—†์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

JOIN

๊ฒฐํ•ฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค JOIN ๊ทธ๋“ค ์‚ฌ์ด. ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ฟผ๋ฆฌ ํŒŒ์„œ์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋…ธ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JoinExpr, ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ •ํ™•ํžˆ ๋‘ ๋ช…์˜ ์ž์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” JOIN "์œ„"์— ์žˆ๋Š” ๋‚ด์šฉ์ด๋ฉฐ ์š”์ฒญ์—์„œ JOIN "์•„๋ž˜"์— ์ž‘์„ฑ๋œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ณ„ํš์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์ด๋“ค์€ ์ผ๋ถ€์˜ ํ›„์†์ž…๋‹ˆ๋‹ค. * Loop/* Join-๋งˆ๋””. Nested Loop, Hash Anti Join,... - ๊ทธ๋Ÿฐ ๊ฑฐ์š”.

๊ฐ„๋‹จํ•œ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์—์„œ ์„œ๋กœ "๊ฒฐํ•ฉ"ํ•˜๋Š” ํ…Œ์ด๋ธ” A์™€ B๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์š”์ฒญ์—์„œ ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. A-JOIN-B๋˜๋Š” B-JOIN-A. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒฐํ•ฉํ•˜๊ณ , ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ์‹์œผ๋กœ ์ด๋Ÿฌํ•œ ์Œ์ด ๋ถ€์กฑํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ณ„ํš์„ ์„ธ์›Œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋‹ค์‹œ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„, ๋ฒŒ์จ ๋ญ”๊ฐ€ ๋ณด์ด๋Š”๊ตฐ์š”!
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ž์‹ B์™€ C๋ฅผ ๋™์‹œ์— ๊ฐ–๋Š” ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์–ด๋–ค ์ˆœ์„œ์ธ์ง€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๊ฒฐํ•ฉํ•˜๊ณ  ๋…ธ๋“œ์˜ ๊ทธ๋ฆผ์„ ๋’ค์ง‘์–ด ๋ด…์‹œ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ž์‹ A์™€ ์Œ (B + C)์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค๊ณผ๋„ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์—„์ฒญ๋‚œ! ์•Œ๊ณ ๋ณด๋‹ˆ ์šฐ๋ฆฌ ๋‘˜์ด๋„ค JOIN ๊ณ„ํš ๋…ธ๋“œ์™€์˜ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์‰ฝ๊ฒŒ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ญ์ƒ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์˜ˆ๋ฅผ ๋“ค์–ด ์š”์ฒญ์— ์žˆ๋Š” ๊ฒฝ์šฐ A JOIN B JOIN C, ๊ทธ๋ฆฌ๊ณ  ๊ณ„ํš์—์„œ๋Š” ์šฐ์„  "์™ธ๋ถ€" ๋…ธ๋“œ A์™€ C๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ์ง€๋งŒ ์š”์ฒญ์—๋Š” ๊ทธ๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋ฉฐ ๊ฐ•์กฐํ•  ๊ฒƒ๋„ ์—†๊ณ  ํžŒํŠธ๋ฅผ ์ฒจ๋ถ€ํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์“ธ ๋•Œ "์‰ผํ‘œ"๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š” A, B.

๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฑฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” "์—ฐ๊ฒฐ ํ•ด์ œ"๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ JavaScript ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ๋•Œ Google Chrome์—์„œ์™€ ๊ฐ™์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์™ผ์ชฝ์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ”„๋กœํŒŒ์ผ๋ง์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ค„๊ณผ ๊ฐ ๋ฌธ์ด "์‹คํ–‰"๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜๋‚ฉ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์นด์ด๋ธŒ์—์„œ ๊ด€๋ จ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ๊ณ„ํš์„ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ์ฐพ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๋งํฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ ์ ˆํ•œ ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์šฐ๋ฆฌ์˜ "๋…ธ๋ฉ€๋ผ์ด์ €".

PostgreSQL ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ: ๊ณ„ํš๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€