[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 ๋๋ค ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ธ์์๋ ์์ฐจ์ค์บ๋ง์ผ๋ก ํด์์กฐ์ธ์ ํด๋ฒ๋ ธ๋ค.
์ฌ์ค ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ด ๋ ์๋ค.
์์ชฝ ํ
์ด๋ธ์ด ์ธ๋ฑ์ค ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ด ๋์ด์์ด์ผ ํ๋ค.

ํด์์กฐ์ธ์ด ๋ฑ์ฅํ๊ณ ๋์๋ ์ฐ์ผ ๊ณณ์ด ๋ง์ด ์ค์ด๋ ํธ์ด๋ค.
์ถ๊ฐ๋ก ์ ๋ ฌ ์ฒ๋ฆฌ๋ ํด์ค์ผ ํ๊ณ , ์ธ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๋ ํด์์กฐ์ธ๋ณด๋ค ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
ํด์์กฐ์ธ์ ํ๋๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ํฌ๊ธฐ๋ฉด ๋์ง๋ง, ๋ณํฉ์กฐ์ธ์ ๋๋ค ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์ผ ์ธ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋๋ ๋ณํฉ์กฐ์ธ์ด ๋น์ ๋ฐํ๋ ํ๊ฐ์ง ์ฅ์ ์ด ์์ผ๋, ์กฐ์ธ ์กฐ๊ฑด์ด ๋๋ฑ ์กฐ๊ฑด(=)์ด ์๋ ๊ฒฝ์ฐ์๋ ํด์์กฐ์ธ๋ณด๋ค ์ ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ด ๋๋ ๋ณํฉ์กฐ์ธ์ด ์ต์ ์ด๋ค.
๊ทธ๋์ ์กฐ์ธ ์ ํ์
- ์์ ๋ฐ์ดํฐ ์กฐ์ธ -> NL์กฐ์ธ
- ํฐ ๋ฐ์ดํฐ ์กฐ์ธ -> ํด์์กฐ์ธ
- ํฐ ๋ฐ์ดํฐ๋ฉด์ ์กฐ์ธ ์กฐ๊ฑด์์ด =์ด ์๋๋ -> ๋ณํฉ์กฐ์ธ
์ ๋๋ก ์ ๋ฆฌํ๋ฉด ๋ ๊ฒ์ด๋ค.
์ฐธ์กฐ
"ใ์น์ ํ SQL ํ๋ใ, ์กฐ์ํ, ๋๋น์(2018)"
https://severalnines.com/database-blog/overview-join-methods-postgresql
https://gs.saro.me/dev?page=20&tn=453