๐ชก Nested Loop Join
๐ก๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ
์ค์ฒฉ ๋ฃจํ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ค๋ฅด์ง ์๋ค. ์๋ฐ์ for ๋ฌธ์ ์๊ฐํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
for(int i = 0; i < n ; i++){
for(int j = 0; j < i; j++){
}
}
์ด์ ๊ฐ์ ์ค์ฒฉ for๋ฌธ์ ์๊ฐํ๊ณ , NL Join์ ์๊ฐํ๋ฉด ์ด๊ฒ๋ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์๊ฐ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๊ฒ์ ์ฟผ๋ฆฌ๋ก ๋ณธ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
/* PL/SQL */
begin
for outer in (select deptno, empno, rpad(ename, 10) ename from emp) loop -- outer ๋ฃจํ
for inner in (select dname from dept where deptno = outer.deptno) loop -- inner ๋ฃจํ
dbms_output.put_line(outer.empno||' : '||outer.ename||' : '||inner.dname);
end loop;
end loop;
end;
/* ์ฟผ๋ฆฌ */
select /*+ ordered use_nl(d) */ e.empno, e.ename, d.dname
from emp e, dept d
where d.deptno = e.deptno
select /*+ leading(e) use_nl(d) */ e.empno, e.ename, d.dname
from dept d, emp e
where d.deptno = e.deptno
๐ค NL Join ์ํ ๊ณผ์ ๋ถ์
select /*+ ordered use_nl(e) */ e.empno, e.ename, d.dname, e.job, e.sal
from dept d, emp e
where e.deptno = d.deptno …………… โ
and d.loc = 'SEOUL' …………… โก
and d.gb = '2' …………… โข
and e.sal >= 1500 …………… โฃ
order by sal desc
Index
* pk_dept : dept.deptno * dept_loc_idx : dept.loc * pk_emp : emp.empno * emp_deptno_idx : emp.deptno * emp_sal_idx : emp.sal
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ฅ์ ์ํํ๊ณ , ์ธ๋ฑ์ค๊ฐ ์ง์ ๋์ด ์๋ค๊ณ ํ ๋ ์คํ ๊ณํ์ ์ด๋ป๊ฒ ๋ ๊น.
1. (2)์ ํด๋นํ๋ dept.log = 'SEOUL' ์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ํด dept_loc_idx ์ธ๋ฑ์ค๋ฅผ ๋ฒ์ ์ค์บํ๋ค.
2. 1์์ ๊ฐ์ ธ์จ rowid๋ฅผ ์ด์ฉํ์ฌ dept ํ ์ด๋ธ์ ์์ธ์คํ๊ณ , (3)์ ํด๋นํ๋ d.gb = '2' ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ฅผ ์ฐพ๋๋ค.
3. dept ํ ์ด๋ธ์์ ์ฝ์ deptno ๊ฐ์ ๊ฐ์ง๊ณ (1)์ ๋ง์กฑํ๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด emp_depton_idx๋ฅผ ๋ฒ์ ์ค์บํ๋ค.
4. emp_deptno_idx ์ธ๋ฑ์ค์์ ๊ฐ์ ธ์จ rowid๋ฅผ ๊ธฐ๋ฐ์ผ๋ก empํ ์ด๋ธ์ ์์ธ์คํ์ฌ (4)์ ํด๋นํ๋ sal >= 1500 ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ฅผ ์ฐพ๋๋ค.
5. ๊ฐ์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ค์ sal ์นผ๋ผ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ค.
์ด๊ฒ์ ๋ณด๋ค๋ณด๋ฉด ์ค์ฒฉ ๋ฃจํ์ ๊ฐ์ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ง์ฝ, ์กฐ๊ฑด์ ๋ถํฉํ๋ ๊ฒ์ ์ฐพ์ผ๋ฉด ํ์ ํ ์ด๋ธ๋ก ๋ด๋ ค๊ฐ ๊ฐ์ ๊ฐ์ ์ฐพ๊ณ , ์๋ค๋ฉด ๋ค์ ์๋ก ์ฌ๋ผ๊ฐ ํ์๋ฅผ ๋ฐ๋ณตํ๋ค. ์ฌ๊ธฐ์์, ์กฐ์ธ์ ํ๋ํ ๋ ๋ฃจํ๋ฅผ ์ค๊ณํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถํ์กฐ๊ฑด์ด ๋ฐ์ํ์ง ์๋๋ก ํํฐ๋ง๋๋ ๋น์จ์ ํ์ธํ๊ณ , ๊ฐ ๋จ๊ณ์ ์ํ ํ์๋ฅผ ๋ถ์ํ์ฌ ๊ณผ๋ํ Random ์์ธ์ค๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ฑฐ๋, ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
๐ฃNL Join์ ํน์ง
1) Random ์์ธ์ค ์์ฃผ์ ์กฐ์ธ ๋ฐฉ์
- ์ธ๋ฑ์ค ๊ตฌ์ฑ์ด ์๋ฒฝํ๋๋ผ๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํ ๋ ๋นํจ์จ์ ์ด๋ค.
2) ์กฐ์ธ์ ํ ๋ ์ฝ๋์ฉ ์์ฐจ์ ์ผ๋ก ์งํ
- Random ์์ธ์ค๋ฅผ ํ์ง๋ง, ์กฐ์ธ ์์ฒด๋ ์์ฐจ์ ์ผ๋ก ์งํํ๊ธฐ ๋๋ฌธ์ ๋์ฉ๋ ์งํฉ์ด๋๋ผ๋ ๊ทน์ ์ธ ์๋ต ์๋๊ฐ ๊ฐ๋ฅ. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ํ ์์ธ์ค ํ ์ด๋ธ์ ์ฒ๋ฆฌ ๋ฒ์์ ์ํด์ ์ ์ฒด ์ผ๋์ด ๊ฒฐ์ ๋จ.
3) ์ธ๋ฑ์ค ๊ตฌ์ฑ ์ ๋ต ํ์
- 1๋ฒ๊ณผ 2๋ฒ์ ํน์ง๋๋ฌธ์ ์ธ๋ฑ์ค ๊ตฌ์ฑ๊ณผ ์ปฌ๋ผ ๊ตฌ์ฑ์ ์ํ ์ํฅ์ ๋ง์ด ๋ฐ์.
4) ์๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ถ๋ถ๋ฒ์์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์จ๋ผ์ธ ํธ๋์ญ์ ํ๊ฒฝ์ ์ ํฉ
๐งถ Sort Merge Join
NL Join์์๋ ์กฐ์ธ ์นผ๋ผ์ ์ ๋๋ก ๊ฐ์ง ์ธ๋ฑ์ค๊ฐ ์์ ๊ฒฝ์ฐ Outer ํ ์ด๋ธ์์ ์ฝํ๋ ๊ฑด๋ง๋ค Inner ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ค์บํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค์ ์ ๋ฌด๊ฐ ๊ต์ฅํ ์ค์ํ๋ค. ์ ๋ ์ธ๋ฑ์ค๊ฐ ์์ ๊ฒฝ์ฐ ์ตํฐ๋ง์ด์ ๋ Sort Merge Join์ด๋ Hash Join์ ๊ณ ๋ คํ๋๋ฐ, Sort Merge Join์ ๋ ํ ์ด๋ธ์ ๊ฐ๊ฐ ์ ๋ ฌํ ๋ค์ ๋ ์งํฉ์ ๋จธ์งํ๋ฉด์ ์กฐ์ธ์ ์ํํ๋ค. ์คํ ์์๋ ์๋์ ๊ฐ๋ค.
1) ์ํธ ๋จ๊ณ : ์์ชฝ ์งํฉ์ ์กฐ์ธ ์นผ๋ผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
2) ๋จธ์ง ๋จ๊ณ : ์ ๋ ฌ๋ ์์ชฝ ์งํฉ์ ์๋ก ๋จธ์ง
* ๋ง์ฝ ์กฐ์ธ ์นผ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด 1์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก ์กฐ์ธ๋ ๊ฐ๋ฅํ๋ค.
๐ฃ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ
Sort Merge Join์ ๊ธฐ๋ณธ์ ์ผ๋ก ์กฐ์ธํ ํ ์ด๋ธ๋ค์ ๋จผ์ ์ ๋ ฌ์ ํ๊ณ , ๊ทธ ๋ค์ ๋ง๋ ๊ฒ์ ์ฐพ์์ ๊ทธ ๋ถ๋ถ๊น์ง ๊ฐ์ ธ์จ๋ค. ์์ฃผ ์ฝ๊ฒ [1, 2, 3, 4] ์ a ํ ์ด๋ธ๊ณผ [ 1, 1, 3, 4, 2, 2, 5 ] ์ b ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋ ์งํ ์ํฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
1) a ํ ์ด๋ธ์ [1, 2, 3, 4] ๋ก ์ ๋ ฌํ๋ค.
2) b ํ ์ด๋ธ์ [1, 1, 2, 2, 3, 4, 5] ๋ก ์ ๋ ฌํ๋ค.
3) a ํ ์ด๋ธ์ 1๊ณผ ๊ฐ์ b ํ ์ด๋ธ์ 1, 1์ ์ฐพ๊ณ , ์์น๋ฅผ ๊ธฐ์ตํ๋ค.
4) ์์น๋ฅผ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ก ํ์ฌ ๋ค์ ์์๋ถํฐ ํ์ํ๋ค.
๐ค Sort Merge Join์ ํน์ง
1. Join ์ ์ ์์ชฝ ์งํฉ์ ์ ๋ ฌํ๋ค.
- NL Join์ ์ ๋ ฌ ์์ด Outer ์งํฉ์ ํ ๊ฑด์ ์ฐจ๋ก๋๋ก ์กฐ์ธํ์ง๋ง, Sort Merge Join์ ์์ชฝ ์งํฉ์ ์กฐ์ธ ์นผ๋ผ ๊ธฐ์ค ์ ๋ ฌํ ํ ์กฐ์ธ์ ์์ํ๋ค. ์ด์ ๊ฐ์ ๋ฐฉ์์ Random ์์ธ์ค ๋ฐฉ์์ ๋นํจ์จ์ ๊ฐ์ ํ ์ ์์ง๋ง, ์ด ๋์ฉ๋์ ํ ์ด๋ธ์ผ ๊ฒฝ์ฐ ์ ๋ ฌ ์์ฒด๊ฐ ํฐ ๋น์ฉ์ด ๋ค๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ๊ฐ์ ์ด ๋ฏธ๋ฏธํ ์ ์๋ค. ๊ทธ๋ฌ๋, ์ผ๋ฐ ์ธ๋ฑ์ค ๋๋ ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค์ ๊ฐ์ด ๋ฏธ๋ฆฌ ์ ๋ ฌ๋์ด์๋ ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํ๋ค๋ฉด ์ ๋ ฌ์์ ์์ด ๋ฐ๋ก ์กฐ์ธ ์ํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ข์ ๋์์ด ๋ ์ ์๋ค.
2. ๋ถ๋ถ์ ์ผ๋ก, ๋ถ๋ถ ๋ฒ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- Sort Merge Join์ ์์ชฝ ์งํฉ์ ์ ๋ ฌํด์ผ ํ๊ธฐ ๋๋ถ์ ๋ถ๋ถ๋ฒ์์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ถ๋ถ์ ์ผ๋ก๋ ๊ฐ๋ฅํ๋ค. for๋ฌธ์ ๋๋ค๊ฐ ํน์ ์กฐ๊ฑด์์ break๋ฅผ ๊ฑฐ๋ ๊ฒ๊ณผ ๊ฐ์ด, ์ฌ์ฉ์๊ฐ ์ผ๋ถ ๋ก์ฐ๋ง Fetch ํ๋ค๊ฐ ๋ฉ์ถ๋ค๋ฉด Outer ์งํฉ์ ๋๊น์ง ์ฝ์ง ์์ ์ํ๋ก ๋๋ ์ ์๋ค.
3. ํ ์ด๋ธ๋ณ ๊ฒ์ ์กฐ๊ฑด์ ์ํด ์ ์ฒด ์ผ๋์ด ์ข์ฐ๋๋ค.
- NL Join์ Outer ์งํฉ์ ๋ชจ๋ ๊ฑด๋ง๋ค Inner ์งํฉ์ ํ์ํ๊ธฐ ๋๋ฌธ์ ์กฐ์ธ ๋์์ด ๋๋ ๊ฑด์์ ์ํด ์ ์ฒด ์ผ๋์ด ์ข์ฐ๋์ง๋ง, Sort Merge Join์ ๋ ์งํฉ์ ๊ฐ๊ฐ ์ ๋ ฌํ ํ์ ์กฐ์ธํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์งํฉ์ ํฌ๊ธฐ, ์ฆ ํ ์ด๋ธ๋ณ ๊ฒ์ ์กฐ๊ฑด์ ์ํด ์ ์ฒด ์ผ๋์ด ์ข์ฐ๋๋ค.
4. ์ค์บ ์์ฃผ์ ์กฐ์ธ ๋ฐฉ์
- Inner ํ ์ด๋ธ์ ๋ฐ๋ณต ์์ธ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จธ์ง ๊ณผ์ ์์ Random ์์ธ์ค๊ฐ ๋ฐ์ํ์ง ์์ง๋ง, ํ ์ด๋ธ ๊ฒ์ ์กฐ๊ฑด์ ํด๋นํ๋ ๋์ ์งํฉ์ ์ฐพ์ ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ Random ์์ธ์ค ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์๋ค. ์ด๋ ๋ฐ์ํ๋ ์์ธ์ค๋์ด ๋ง๋ค๋ฉด Sort Merge Join์ ์ด์ ์ด ์ฌ๋ผ์ง ์ ์๋ค.
๐น Hash Join
๐ก๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ
Hash Join์ ๋ ์ค ์์ ์งํฉ์ ์ฝ์ด ํด์ ์์ญ์ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ๋ฐ๋์ชฝ ํฐ ์งํฉ์ ์ฝ์ ๋ค ํด์ ํ ์ด๋ธ์ ํ์ํ๋ฉด์ ์กฐ์ธํ๋ ๋ฐฉ์์ด๋ค.
์ถ๋ ฅ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์๋ ์์ง๋ง ๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ํ์ฌ ๊ฐ์ ์ถ๋ ฅ๊ฐ์ ๋ณด์ฅํ๋ฉฐ, ๋ค๋ฅธ ์ ๋ ฅ๊ฐ์ ๋ํด ์ถ๋ ฅ๊ฐ์ด ๊ฐ์ ์ ์๋๋ฐ ์ด๊ฒ์ 'ํด์ ์ถฉ๋' ์ด๋ผ๊ณ ํ๋ค. ํด์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ ๋ ฅ๊ฐ์ด ๋ค๋ฅธ ์ํธ๋ฆฌ๊ฐ ํ ํด์ ๋ฒํท์ ๋ด๊ธธ ์ ์๋ค.
1) ํด์ ํ ์ด๋ธ ์์ฑ
- ๋ ์งํฉ ์ค ์๋ค๊ณ ํ๋จ๋๋ ์งํฉ์ ์ฝ์ด ํด์ ํจ์๋ฅผ ์ฌ์ฉ, ํ ์ด๋ธ์ ๋ง๋ ๋ค.
2) Probe Input ์ค์บ
- ์ ํ๋์ง ์์ ๋๋จธ์ง ์งํฉ(ํฐ ์งํฉ) ์ ์ค์บํ๋ค.
3) ํด์ ํ ์ด๋ธ ํ์
- 2์์ ์ฝ์ ๋ฐ์ดํฐ๋ก ํ ์ด๋ธ์ ํ์ํ๋ค. ์ฌ๊ธฐ์์๋, ํจ์์์ ๋ฆฌํด๋ฐ์ ๋ฒํท ์ฃผ์๋ก ์ฐพ์๊ฐ ์ฒด์ธ์ ์ค์บํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Hash Join์ Random ์์ธ์ค ๋ถํ๊ฐ ์์ผ๋ฉฐ ์ ๋ ฌํ๋ ๋ถ๋ด ๋ํ ์๋ค. ๊ทธ๋ฌ๋, ํด์ ํ ์ด๋ธ์ ์์ฑํ๋ ๋น์ฉ์ด ๋ค๊ธฐ ๋๋ฌธ์ ์์ ์งํฉ(Build Input)์ด ์์ ๋ ํจ๊ณผ์ ์ด๋ค. ๋ํ, ํด์ ํค ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์ค๋ณต ๊ฐ์ด ๊ฑฐ์ ์์ด์ผ ํจ๊ณผ์ ์ด๋ค.
๐ค Build Input์ด ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ด๊ณผํ๋ค๋ฉด?
Hash Join์ Hash Build๋ฅผ ์ํด ๊ฐ์ฉํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ถฉ๋ถํ ๋ด๊ธธ ์ ๋๋ก ์์์ผ ํจ๊ณผ์ ์ธ๋ฐ, ๋ง์ฝ ๊ทธ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๋ DBMS๋ 'Grace Hash Join' ์ด๋ผ๊ณ ์๋ ค์ง ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
1) ํํฐ์ ๋จ๊ณ
- ์กฐ์ธ๋๋ ์์ชฝ ์งํฉ ๋ชจ๋ ์กฐ์ธ ์นผ๋ผ์ ํด์ ํจ์๋ฅผ ์ ์ฉํ๊ณ , ๋ฐํ๋ ๊ฐ์ ๋ฐ๋ผ์ ๋์ ํํฐ์ ๋์ ์ํํ๋ค. ๋ ๋ฆฝ์ ์ํ์ ์ํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์๋ธ์งํฉ์ผ๋ก ๋ถํ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ ํํฐ์ ๋จ๊ณ์์ ์์ชฝ ์งํฉ์ ๋ชจ๋ ์ฝ์ด์ ๋์คํฌ์ Temp ๊ณต๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ํฌ๊ฒ ๋จ์ด์ง๋ค.
2) ์กฐ์ธ ๋จ๊ณ
- ํํฐ์ ๊ด๊ณ๊ฐ ์๋ฃ๋๋ฉด ๊ฐ ํํฐ์ ์ pair์ ๋ํ์ฌ ํ๋์ ์กฐ์ธ์ ์ํํ๋ค. ์ด๋, ๊ฐ๊ฐ ์ ์ฅ๋์ด์๊ธฐ ๋๋ฌธ์ Build Input๊ณผ Probe Input์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒฐ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํํฐ์ ์ด ์งํ๋๊ธฐ ์ ์ ์ด๋ ์ชฝ์ด ์์ ํ ์ด๋ธ์ด์๋์ง์ ์๊ด ์์ด ๊ฐ ํํฐ์ pair ๋ณ๋ก ์์ ํํฐ์ ์ Build Input์ผ๋ก ์ ํํ์ฌ ํด์ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ํ์ ๋ฐ๋์ชฝ ํํฐ์ ๋ก์ฐ๋ฅผ ์ฝ์ผ๋ฉด์ ํ์ํ๋ ๋ถํ ์ ๋ณต ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๐ฃ Build Input ํด์ ํค ๊ฐ์ ์ค๋ณต์ด ๋ง์ ๋?
ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ํด์ ์ถฉ๋์ ์ผ๋ง๋ ์ต์ํํ ์ ์๋ ์ง์ ๋ฐ๋ผ ๋ฌ๋ ค์๋๋ฐ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ๊ทธ๋งํผ ๋ง์ ๋ฒํท์ ํ ๋นํด์ผ ํ๋ค. ํค ์นผ๋ผ์ ์ค๋ณต ๊ฐ์ด ๋ง๋ค๋ฉด ํ๋์ ๋ฒํท์ ๋ง์ ์ํธ๋ฆฌ๊ฐ ๋ฌ๋ฆฌ๊ฒ ๋๊ณ , ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด ํด์ ๋ฒํท์ ๋น ๋ฅด๊ฒ ์ฐพ๋๋ค๊ณ ํ๋๋ผ๋ ์ค์บํ๋ ๊ณผ์ ์์ ๋ง์ ์๊ฐ์ ํ๋นํ๊ธฐ ๋๋ฌธ์ ํ์ ์๋๊ฐ ์ ํ๋๋ค.
โจHash Join ์ฌ์ฉ ๊ธฐ์ค
- ํ์ชฝ ํ ์ด๋ธ์ด ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ๋ด๊ธธ ์ ๋๋ก ์ถฉ๋ถํ ์์์ผ ํจ
- Build Input ํด์ ํค ์นผ๋ผ์ ์ค๋ณต์ด ๊ฑฐ์ ์์ด์ผ ํจ
์ด ๋ ์กฐ๊ฑด์ด ์ ์ผ ์ค์ํ ์กฐ๊ฑด์ด๋ฉฐ, ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅ๋ฐ์ ์ ์๋ค. ๋ํ, ์๋์ ๊ฐ์ ์ํฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ผ ํจ๊ณผ์ ์ด๋ค.
- ์กฐ์ธ ์นผ๋ผ์ ์ ๋นํ ์ธ๋ฑ์ค๊ฐ ์์ด NL Join์ด ๋นํจ์จ์ ์ผ ๋
- ์กฐ์ธ ์นผ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํด๋ NL Join ๋๋ผ์ด๋น ์งํฉ์์ Inner ์ชฝ ์งํฉ์ผ๋ก์ ์กฐ์ธ ์์ธ์ค๋์ด ๋ง์ ๋
- Sort Merge Join ํ๊ธฐ์ ๋ ํ ์ด๋ธ์ด ๋๋ฌด ์ปค ์ ๋ ฌ ๋ถํ๊ฐ ์ฌํ ๋
- ์ํ๋น๋๊ฐ ๋ฎ๊ณ ์กฐ์ธํ ๋
* Hash Join์ ๋ค๋ฅธ ์กฐ์ธ๋ณด๋ค ํจ์ฌ ์๋๊ฐ ๋น ๋ฅด์ง๋ง, ์ํ์๊ฐ์ด ์งง์ผ๋ฉด์๋ ์ํ ๋น๋๊ฐ ๋งค์ฐ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์ํ์ด ๋๋๊ณ ๋ฐ๋ก ์๋ฉธํ๋ Hash ๊ตฌ์กฐ ์ ๊ณ์ํด์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ ์ฆ๊ฐ์ํค๊ฒ ๋๋ฉฐ ์์ ํ๋ณด๋ฅผ ์ํ ๊ฒฝํฉ์ ๋ฐ์์ํจ๋ค.
๐ Scalar Subquery
์ฟผ๋ฆฌ์ ๋ด์ฅ๋์ด์๋ ๋๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ธ๋ก์ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ํต์นญํ๋๋ฐ, ๊ทธ ์ค์์ ํจ์์ฒ๋ผ ํ ๋ ์ฝ๋๋น ์ ํํ ํ๋์ ๊ฐ๋ง์ ๋ฆฌํดํ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ 'Scalar Subquery' ๋ผ๊ณ ํ๋ค. ๋ช ๊ฐ์ง์ ์์ธ์ฌํญ์ ๋บ๋ค๋ฉด ์นผ๋ผ์ด ์ฌ ์ ์๋ ๋๋ถ๋ถ์ ์์น์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Scalar Subquery์๋ ๋ด๋ถ์ ์ผ๋ก ์บ์ฑ ๊ธฐ๋ฒ์ด ์์ฉ๋๋ฉฐ, ์ด๋ฅผ ์ด์ฉํ ํ๋์ด ์์ฃผ ํํด์ง๋ค.
์ด๋ฅผ ์ฌ์ฉํ ๋ ํ ๋ ์ฝ๋๋น ํ๋์ ๊ฐ๋ง ์ฝ๋๋ค๋ ํน์ง๋๋ฌธ์ ์ฌ์ฉํ ๋ ๋ฐ๋ณต ๋๋ ํ ์ด๋ธ ์ ์ฒด ์ค์บ ๋ฑ์ ๋นํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ฒ ๋๋๋ฐ, ๊ตฌํ๊ณ ์ ํ๋ ๊ฐ๋ค์ ๋ชจ๋ ๊ฒฐํฉํ ๋ค ๋ฐ๊นฅ์ชฝ ์์ธ์ค ์ฟผ๋ฆฌ์์ substr ํจ์๋ก ๋ถ๋ฆฌํ๋ ํํ๋ก ์ฌ์ฉํ ์ ์๋ค.
/* Befor */
select d.deptno, d.dname, avg_sal, min_sal, max_sal
from dept d right outer join (select deptno, avg(sal) avg_sal, min(sal) min_sal, max(sal) max_sal
from emp group by deptno) e
on e.deptno = d.deptno
where d.loc = 'CHICAGO'
/* after */
select deptno, dname , to_number(substr(sal, 1, 7)) avg_sal , to_number(substr(sal, 8, 7)) min_sal , to_number(substr(sal, 15)) max_sal
from ( select d.deptno, d.dname ,(select lpad(avg(sal), 7) || lpad(min(sal), 7) || max(sal)
from emp
where deptno = d.deptno) sal
from dept d
where d.loc = 'CHICAGO' )
'DBMS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[PostgreSQL]DB ๋ฆฌํฉํ ๋ง(1) - ํ์ฌ ์ฌ์ฉํ๋ DB ํ ์ด๋ธ ์ ๋ฆฌํ๊ธฐ (0) | 2024.07.25 |
---|---|
Materialized view ๋ฏ์ด๊ณ ์น๊ธฐ (1) (2) | 2024.07.24 |
์ธ๋ฑ์ค ํ๋ (0) | 2024.04.24 |
์ธ๋ฑ์ค ๊ธฐ๋ณธ ์๋ฆฌ (0) | 2024.04.23 |
์ตํฐ๋ง์ด์ (0) | 2024.04.18 |