DBMS

์กฐ์ธ ๊ธฐ๋ณธ ์›๋ฆฌ

JEE-JEEE 2024. 4. 25. 15:26

 

 

๐Ÿชก 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' )