DB Join์ด ๋ฌด์์ธ์ง ์ค๋ช ํ๊ณ , ๊ฐ๊ฐ์ ์ข ๋ฅ์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์.
โข ์ฌ์ค, JOIN์ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๊ธฐ์ ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ ๊ตฌํ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ ์์์ ๋ํด ์ค๋ช
ํด ์ฃผ์ธ์.
โข ๊ทธ๋ ๋ค๋ฉด ์
๋ ฅํ ์ฟผ๋ฆฌ์์ ์ด๋ค ๊ตฌํ ๋ฐฉ์์ ์ฌ์ฉํ๋์ง๋ ์ด๋ป๊ฒ ์ ์ ์๋์?
โข ์ ์ง๋ฌธ๋ค์ ํตํด ์ธ๋ฑ์ค์ ์ค์์ฑ์ ์ ์ ์์๋๋ฐ, ๊ทธ๋ ๋ค๋ฉด JOIN์ ์ฑ๋ฅ๋ ์ธ๋ฑ์ค์ ์ ๋ฌด์ ์ํฅ์ ๋ฐ๋์?
์ด๋ ๋ฏ Join ์ ๋ชฉ์ ์ ๋ ์ด์์ ํ ์ด๋ธ์ ๊ฒฐํฉํ์ฌ ํ๋์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค.
๊ทธ๋ฐ๋ฐ, n๊ฐ์ ํ ์ด๋ธ์ joinํ๋ค๊ณ ํ๋ฉด, n๊ฐ์ ํ ์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ๊ณผ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฏ๋ก joinํ๋ ํ ์ด๋ธ์ ๊ฐ์๊ฐ ๋ง์์ง ์๋ก ์๋๊ฐ ๋๋ ค์ง๋ค.
๋ฌผ๋ก ๋ฐ์ดํฐ์์ด ๋ง์๋ ์ฟผ๋ฆฌ์ ์๋๋ ํ์ ํ๊ฒ ๋๋ ค์ง๋ค.
์กฐ์ธ์ด ์ด๋ค ์๋ฆฌ๋ก ์ด๋ฃจ์ด์ง๋์ง ์์๋ณด๊ณ ํจ์จ์ ์ธ ์กฐ์ธ์ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์!
SQL์์ ์กฐ์ธ ์ฐ์ฐ์ ์ํํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ ํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ๋ ์๋์ ๊ฐ์ต๋๋ค.
๋ฌผ๋ก ๋ ๋ง์ ์กฐ์ธ ๋ฐฉ์์ด ์์ง๋ง ๊ฐ์ฅ ๋ํ์ ์ธ ์ธ๊ฐ์ง ๋ฐฉ์์ด๋ค.
์ ๊ฒฐํจ ์๊ณ ๋ฆฌ์ฆ ์ค ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ง๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ, ๊ฒฐํฉํค(Key), ์ธ๋ฑ์ค(Index)์ ๊ฐ์ ์์ธ์ ๋ฐ๋ผ ์ตํฐ๋ง์ด์ ๊ฐ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.
SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ ์คํ์ ์ํค๋ฉด ๊ทธ ์ฟผ๋ฆฌ๋ ์ตํฐ๋ง์ด์ (Optimizer)๋ก ์ ์ก๋ฉ๋๋ค.
์ตํฐ๋ง์ด์ ๋ "์ต์ ํ" ๋ผ๋ ์๋ฏธ์ธ๋ฐ, '๋ฐ์ดํฐ์ ์ด๋ป๊ฒ ์ ๊ทผํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ง'๊ฐ ์ต์ ํ์ ๋์์ด ๋ฉ๋๋ค.
์ด๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ, ์ธ๋ฑ์ค ์ ๋ฌด ๋ฑ์ ์ฌ๋ฌ ์กฐ๊ฑด์ ๊ณ ๋ คํด์ ์ ํ ๊ฐ๋ฅํ ๋ง์ '์คํ๊ณํ'์ ์์ฑํ๊ณ , ๊ฐ ์ ํ์ง์ ๋น์ฉ์ ์ฐ์ฐํ๊ณ , ๊ฐ์ฅ ๋ฎ์ ๋น์ฉ์ ๊ฐ์ง ์คํ๊ณํ์ ์ ํํด์ค๋๋ค.
์ฆ, ์ฌ๋ฌ ๊ฒฐ๊ณผ ๋์ถ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ๊ณํ์ ์ ํํด์ฃผ๋ ๋๊ตฌ๋ผ๊ณ ์ ๋ฆฌํ ์ ์๊ฒ ์ต๋๋ค.
์ด ์ค Nested Loops Join ์ ๋ค๋ฅธ ๊ฒฐํฉ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ์ด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ์ค๋์ Nested Loops Join ์ ์ค์ ์ผ๋ก ์ดํด๋ณด์.
Nested Loops Join์ ์ด๋ฆ ๊ทธ๋๋ก ์ค์ฒฉ ๋ฐ๋ณต์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
Nested Loops Join ์ ์๋ฆฌ
- Table A์ Table B ๊ฐ ์ด๋ค Key ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐํฉ์ ์งํํฉ๋๋ค.
- Table A (๊ตฌ๋ ํ ์ด๋ธ, Driving Table) ์ ์ฒซ ๋ฒ์งธ ํ์์ ์ถ๋ฐํด Table B (๋ด๋ถ ํ ์ด๋ธ, Inner Table) ์ ๋ชจ๋ ํ์ ์ค์บํฉ๋๋ค. ์ด๋ ๊ฒฐํฉ ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
- Table A ์ ์ฒซ ๋ฒ์งธ ํ์ ์ค์บ์ด ๋๋๋ฉด ๋ ๋ฒ์งธ ํ์ด Table B ์ ๋ชจ๋ ํ์ ์ค์บํฉ๋๋ค.
- 2~3๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ Table A ์ ๋ง์ง๋ง ํ์ด Table B ์ ๋ชจ๋ ํ์ ์ค์บํ๋ฉด ๊ฒฐํฉ์ด ์๋ฃ๋ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ ์ค์ฒฉ for ๋ฌธ์ ์๋ฆฌ์ ๊ฐ์ต๋๋ค.
Table A, Table B ์ ๊ฒฐํฉ ๋์ ๋ ์ฝ๋ ์๋ฅผ R(A), R(B) ๋ผ๊ณ ํ๋ค๋ฉด ์ ๊ทผ๋๋ ๋ ์ฝ๋ ์๋ R(A) X R(B) ๊ฐ ๋ฉ๋๋ค.
์กฐ๊ธ ์๊ฐ์ ํด๋ณด๋ฉด ๊ฒฐ๊ตญ Nested Loops Join ์์ ์คํ์๊ฐ์ R(A) X R(B)์ ๋น๋กํ๊ฒ๋๊ณ ,
์ฑ๋ฅ์ ๋ํ๊ธฐ ์ํด์ R(A) X R(B) ์ ๊ฐ์ ๋ฎ์ถฐ์ผํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ์ฑ๋ฅ์ ๋ํ ์( = R(A) X R(B) ๊ฐ์ ๋ฎ์ถ ์) ์์๊น์?
์ ์กฐ๊ฑด์ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
๋ค์ ๊ฒฐ๋ก ์ผ๋ก,,,,,
์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ Nested Loops Join
๋ด๋ถ ํ
์ด๋ธ์ ๊ฒฐํฉํค์ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๊ฒ ๋๋ฉด Driving Table ์์ Inner Table ๋ก ์ค์บ์ ํ๋ฌ ๊ฐ ๋ ๋ชจ๋ ํ์ ๋ํด ์ค์บ์ ํ ํ์๊ฐ ์๊ฒ ๋ฉ๋๋ค.
์ฆ, R(A) * R(B) ์ ๊ฐ์ด ์ค์ด๋ ๋ค๋ ๊ฒ์ด๊ณ , ์ด๋ฐ ์๋ฆฌ๋ก ์คํ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
๊ตฌ๋ํ ์ด๋ธ์ ์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ์ ์คํ๊ณํ์ ๋ฐ๋ผ ๊ฒฐ์ ์ ํ๊ฒ ๋ฉ๋๋ค.
์ต์ ์ ์คํ๊ณํ์ ์์ "๊ตฌ๋ํ ์ด๋ธ์ด ์๊ณ ๋ด๋ถํ ์ด๋ธ ๊ฒฐํฉํค์ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ" ๋ผ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ ๋น์ฉ์ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.
๋ง์ฝ ๋ ํ ์ด๋ธ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋ ์๋ค๋ฉด ๋ ์ฝ๋ ์์ ๋ฐ๋ผ ์ตํฐ๋ง์ด์ ๊ฐ ์์์ ๊ตฌ๋ํ ์ด๋ธ์ ์ ํํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ตํฐ๋ง์ด์ ๋ฅผ ๋ฏฟ๊ณ join ์ฐ์ฐ์ ์ํํ๋ฉด ๋ฉ๋๋ค.
Inner Join ์ ๊ฒฝ์ฐ ์ด๋ ํ ์ด๋ธ์ ๋จผ์ ์ฝ์ด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๊ธฐ ๋๋ฌธ์ ์ตํฐ๋ง์ด์ ๊ฐ ์กฐ์ธ์ ์์๋ฅผ ์กฐ์ ํด ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ ๊ท์น๊ณผ ๋ฌด๊ดํ๊ฒ ๊ตฌ๋ํ ์ด๋ธ์ด ์ ํด์ง๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
Outer Join์ ๋ฐ๋์ Outer ๊ฐ ๋๋ ํ ์ด๋ธ์ ๋จผ์ ์ฝ์ด์ผํ๊ธฐ ๋๋ฌธ์ ์ตํฐ๋ง์ด์ ๊ฐ ์กฐ์ธ์ ์์๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
์ฆ, Left Outer Join ์ผ ๋ ์ผ์ชฝ ํ ์ด๋ธ์ด, Right Outer Join ์ผ ๋ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ด ๋๋ผ์ด๋น ํ ์ด๋ธ์ด ๋ฉ๋๋ค.
๋ํ์ ์ธ ์์๋ก๋ ์ฅ๊ธฐ์ ์ธ DB ์ด์ฉ์ค์ ๋ฐ์ดํฐ์์ ์ฆ๊ฐ ๋ฑ์ ์ ๋ณด๊ฐ ๋ณํด ์คํ๊ณํ์ด ์์ข์ ๋ฐฉํฅ์ผ๋ก ๋ณํํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํนํ Join ์ ์คํ๊ณํ์ ๋ณ๋์ด ์ผ์ด๋- ๊ธฐ ๊ฐ์ฅ ์ฌ์ด ์ฐ์ฐ์ ๋๋ค.
์กฐ์ธ ์์๋ ์ฌ๋ฌ๊ฐ์ง์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์๊ณ , ์๊ณ ๋ฆฌ์ฆ์ด ๋ณํ๋ฉด ์ฑ๋ฅ์ด ๋ณํ๊ธฐ ๋๋ฌธ
SQL ์ฟผ๋ฆฌ์์ ์ต๋ํ ๊ฒฐํฉ(Join)์ ํผํ๊ณ ์กฐ์ธ์ ๋์ฒดํ ์ ์๋ ๋ค๋ฅธ ์๋จ์ ์ ํ์ฉํ์!
์ฐธ๊ณ
https://pearlluck.tistory.com/46
https://rebro.kr/167
https://velog.io/@leesomyoung/SQL-Join-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0
https://schatz37.tistory.com/2 (๊ฐ์ถ!!)