[PostgreSQL] Join

๋ณธ ํฌ์ŠคํŠธ์—์„œ๋Š”, ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€๋™์ž‘์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค.

postgresql์€ ํฌ๊ฒŒ ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ, ํ•ด์‹œ ์กฐ์ธ, ๋ณ‘ํ•ฉ ์กฐ์ธ์„ ์ง€์›ํ•œ๋‹ค.



์ค‘์ฒฉ ๋ฃจํ”„(Nested Loop:NL) ์กฐ์ธ

์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ์กฐ์ธ์ด๋‹ค.
A์™€ B ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•œ๋‹ค๋ฉด, A๋กœ ๋ฐ˜๋ณต ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฌ๊ณ , ๊ทธ ์•ˆ์— B ์ค‘์ฒฉ๋ฃจํ”„๋ฅผ ๋Œ๋ ค์„œ ์ผ์น˜ํ•˜๋Š”๊ฑธ ๋ฑ‰์–ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ join ์กฐ๊ฑด์œผ๋กœ ๋น„๊ต์—ฐ์‚ฐ ๋“ฑ์„ ํ–‰ํ•  ๋•Œ ์ค‘์ฒฉ๋ฃจํ”„ ์กฐ์ธ์ด ๋ฐœ์ƒํ•˜๋Š” ๋“ฏ ํ•˜๋‹ค.
=๋กœ ๋™๋“ฑ ๋น„๊ต๋ฅผ ํ•  ๋•Œ๋Š” ์ค‘์ฒฉ๋ฃจํ”„ ์กฐ์ธ์ด ์ž˜ ๋œจ์ง€ ์•Š๋Š”๋‹ค. ํ•ด์‹œ์กฐ์ธ ์“ฐ๋ผ๊ณ .

ํ•„ํ„ฐ๋ง ์—†์ด ๋ฌด์ž‘์ • ๋‹ค ๊ธ์–ด์˜ฌ ๋•Œ๋„ ์ค‘์ฒฉ๋ฃจํ”„ ์กฐ์ธ์ด ๋œฌ๋‹ค.

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

๋ฐ‘์— ๋‚˜์˜ค๋Š” ํ•ด์‹œ์กฐ์ธ์ด๋‚˜ ๋ณ‘ํ•ฉ์กฐ์ธ์ด ์†๋„๋ฉด์—์„œ๋Š” ๋” ๋น ๋ฅธ ํŽธ์ด๊ธด ํ•˜์ง€๋งŒ, CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ข€ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด๋‹ค.
๊ทธ๋ž˜์„œ NL์กฐ์ธ์ด ์•„์ฃผ ๋น„ํšจ์œจ์ ์ธ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด, NL ์กฐ์ธ์„ ์“ฐ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.
NL ์กฐ์ธ์œผ๋กœ๋„ ์•ฝ 0.1์ดˆ ๊ฑธ๋ฆฌ๋Š” ์ ๋‹นํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ตณ์ด 0.01 ๊ฑธ๋ฆฌ๋Š” ํ•ด์‹œ์กฐ์ธ์œผ๋กœ ๋ฐ”๊พธ์ง€๋Š” ๋ง๋ผ๋Š” ๋ง์ด๋‹ค.




ํ•ด์‹œ(Hash) ์กฐ์ธ

ํ•ด์‹œ์กฐ์ธ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ๊ฑธ ํ†ตํ•ด์„œ ๋น ๋ฅธ ๋žœ๋ค ๋งค์นญ์„ ๋…ธ๋ฆฌ๋Š” ์กฐ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ์กฐ์ธ ์กฐ๊ฑด์— ๋™๋“ฑ ๋น„๊ต๋ฅผ ๊ฑธ ๋•Œ ์ฃผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค.

์œ„ ์ฟผ๋ฆฌํ”Œ๋žœ์„ ํ•ด์„ํ•ด๋ณด๋ฉด,
Person ํ…Œ์ด๋ธ”๋กœ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , Person ํ•ด์‹œํ…Œ์ด๋ธ”๊ณผ Text ํ…Œ์ด๋ธ”์„ ๋น„๊ต(Hash Cond)ํ•ด ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด์‹œํ…Œ์ด๋ธ”์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ž‘์€ ํ…Œ์ด๋ธ”์— ์ƒ์„ฑํ•œ๋‹ค. ๊ฐ€๊ธ‰์  ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์œ„์˜ ๊ฒฝ์šฐ์—๋„ texts ํ…Œ์ด๋ธ”์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜๋งŒ๊ฐœ, persons ํ…Œ์ด๋ธ”์€ ์—ด๊ฐœ๋ฐ–์— ๋˜์ง€ ์•Š์•˜๋‹ค.

ํ•ด์‹œ์กฐ์ธ์€ ๋ณ‘ํ•ฉ์กฐ์ธ์˜ ์กฐ๊ธˆ ๋” ๋ฐœ์ „๋œ ํ˜•ํƒœ๋ผ ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
์›ฌ๋งŒํ•ด์„œ๋Š” hash join์ด ๋” ์ ์šฉํ•˜๊ธฐ๋„ ์‰ฝ๊ณ , ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ง‘ํ•ฉ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜ค๋ฒ„์‚ฌ์ด์ฆˆ๋ผ๋„ ๋‹ค๋ฅธ ํ•˜๋‚˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘๋‹ค๋ฉด in-memory ์กฐ์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๋‘˜๋‹ค ์˜ค๋ฒ„์‚ฌ์ด์ฆˆ๋ผ์„œ ๋‹ค ๋””์Šคํฌ์— ์“ฐ๋”๋ผ๋„ ์›ฌ๋งŒํผ์€ ๋น ๋ฅด๊ณ .




๋ณ‘ํ•ฉ(Merge) ์กฐ์ธ

๋ณ‘ํ•ฉ์กฐ์ธ์€ ์˜ˆ์ „์—๋Š” ํ•ด์‹œ์กฐ์ธ์˜ ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋˜ ์กฐ์ธ ๊ธฐ๋ฒ•์ด์ง€๋งŒ, ํ•ด์‹œ์กฐ์ธ์ด ๋“ฑ์žฅํ•˜๊ณ  ๋‚˜์„œ๋Š” ํ•ด์‹œ์กฐ์ธ์˜ ๋นˆ์ž๋ฆฌ๋ฅผ ๋ฉ”๊พธ๊ธฐ๋งŒ ํ•˜๋Š” ๋А๋‚Œ์ด๋‹ค. ๋ณ‘ํ•ฉ์กฐ์ธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ์— ํšจ์œจ์ ์ธ ์กฐ์ธ์ด๋‹ค.

๋ณ‘ํ•ฉ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ์ธ๋ฑ์Šค ์Šค์บ”์ด ๋– ์•ผ ํ•œ๋‹ค.
๋•Œ๋ฌธ์— text_id์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์กฐ์ธ์„ ์‹œ๋„ํ•ด๋ดค๋‹ค.

์Œ?
text_id๊ณผ t.id ๋‘˜๋‹ค ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ธ์Œ์—๋„ ์ˆœ์ฐจ์Šค์บ”๋งŒ์œผ๋กœ ํ•ด์‹œ์กฐ์ธ์„ ํ•ด๋ฒ„๋ ธ๋‹ค.

์‚ฌ์‹ค ์ถ”๊ฐ€์ ์ธ ์กฐ๊ฑด์ด ๋˜ ์žˆ๋‹ค.
์–‘์ชฝ ํ…Œ์ด๋ธ”์ด ์ธ๋ฑ์Šค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์ด ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

ํ•ด์‹œ์กฐ์ธ์ด ๋“ฑ์žฅํ•˜๊ณ  ๋‚˜์„œ๋Š” ์“ฐ์ผ ๊ณณ์ด ๋งŽ์ด ์ค„์–ด๋“  ํŽธ์ด๋‹ค.
์ถ”๊ฐ€๋กœ ์ •๋ ฌ ์ฒ˜๋ฆฌ๋„ ํ•ด์ค˜์•ผ ํ•˜๊ณ , ์ธ๋ฉ”๋ชจ๋ฆฌ ์—ฐ์‚ฐ๋„ ํ•ด์‹œ์กฐ์ธ๋ณด๋‹ค ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
ํ•ด์‹œ์กฐ์ธ์€ ํ•˜๋‚˜๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ํฌ๊ธฐ๋ฉด ๋˜์ง€๋งŒ, ๋ณ‘ํ•ฉ์กฐ์ธ์€ ๋‘˜๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์•ผ ์ธ๋ฉ”๋ชจ๋ฆฌ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜๋„ ๋ณ‘ํ•ฉ์กฐ์ธ์ด ๋น›์„ ๋ฐœํ•˜๋Š” ํ•œ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์œผ๋‹ˆ, ์กฐ์ธ ์กฐ๊ฑด์ด ๋™๋“ฑ ์กฐ๊ฑด(=)์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ํ•ด์‹œ์กฐ์ธ๋ณด๋‹ค ์œ ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿด ๋•Œ๋Š” ๋ณ‘ํ•ฉ์กฐ์ธ์ด ์ตœ์ ์ด๋‹ค.


๊ทธ๋ž˜์„œ ์กฐ์ธ ์„ ํƒ์€

  1. ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ์ธ -> NL์กฐ์ธ
  2. ํฐ ๋ฐ์ดํ„ฐ ์กฐ์ธ -> ํ•ด์‹œ์กฐ์ธ
  3. ํฐ ๋ฐ์ดํ„ฐ๋ฉด์„œ ์กฐ์ธ ์กฐ๊ฑด์‹์ด =์ด ์•„๋‹๋•Œ -> ๋ณ‘ํ•ฉ์กฐ์ธ

์ •๋„๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.


์ฐธ์กฐ
"ใ€Ž์นœ์ ˆํ•œ SQL ํŠœ๋‹ใ€, ์กฐ์‹œํ˜•, ๋””๋น„์•ˆ(2018)"
https://severalnines.com/database-blog/overview-join-methods-postgresql
https://gs.saro.me/dev?page=20&tn=453