Nested Loop ์กฐ์ธ
- ํ๋์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฐพ๊ณ , ๊ทธ ๋ค์ ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๋ฐฉ์
- ๋จผ์ ์กฐํ ๋๋ ํ ์ด๋ธ์ Outer Table ์ด๋ผ๊ณ ํ๊ณ , ๊ทธ ๋ค์ ์กฐํ๋๋ ํ ์ด๋ธ์ Inner Table.
์ฝ๋ฉ ํํ๋ก ์ค์ ํด๋ณด์๋ฉด...
for(i=0; i<dept.length; i++) { // Outer table
for(j=0; j<emp.length; j++) { // Inner table
// Search
}
}
์ฌ์ฉ๋ฒ ์์
select /* ordered use_nl(b) */ *
from EMP a, DEPT b
where a.DEPTNO = b.DEPTNO
and a.DEPTNO = 10;
์ฅ๋จ์
1. ์ธ๋ฑ์ค์ ์ํ Random access ์ ๊ธฐ๋ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ์ ํฉํ์ง ์์.
2. Driving Table๋ก๋ ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋, where ์ ์กฐ๊ฑด์ผ๋ก row๋ฅผ ์ค์ผ ์ ์๋ ํ ์ด๋ธ์ด์ด์ผ ํจ.
3. Driven Table์๋ ์กฐ์ธ์ ์ํ ์ ์ ํ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์์ด์ผ ํจ.
4. ์ ํ ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ํตํด ํํ ํ ์ด๋ธ์ ์์ธ์คํ ๋ Random I/O๊ฐ ์ผ์ด๋จ : ์ด๊ฒ์ ์ค์ฌ์ผ ์ฑ๋ฅ์ด ํฅ์๋จ.
์ฑ๋ฅ ํฅ์์ ์ํ Driving Table(Outer Table) ์ ๋ ๋ฐฉ๋ฒ
1. ํํธ(Hint) ์ฌ์ฉ
/*+ORDERED*/ -- from์ ์ ๊ธฐ์ ํ ํ
์ด๋ธ ์์๋๋ก ์ ์ด
/*+LEADING (table๋ช
)*/ -- ํํธ ๋ด์ ์ ์๋ ํ
์ด๋ธ์ด ๋๋ผ์ด๋น์ผ๋ก ์ฒ๋ฆฌ๋จ
๋ ์ค์ ํ๋๋ฅผ ์ฌ์ฉํ๋, 2๊ฐ์ง๋ฅผ ๋์์ ์ฌ์ฉํ๊ฒ ๋๋ฉด LEADING ํํธ๋ ์ ์ฉ ์๋จ.
2. ๋ทฐ ์ฌ์ฉ
Sort Merge ์กฐ์ธ
- ๋ ๊ฐ์ ํ ์ด๋ธ์ SORT_AREA ๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ชจ๋ ๋ก๋ฉ(loading)ํ๊ณ Sort๋ฅผ ์ํ
- ๋ ๊ฐ์ ํ ์ด๋ธ์์ SORT๊ฐ ์๋ฃ๋๋ฉด ๋ ๊ฐ์ ํ ์ด๋ธ์ ๋ณํฉ(Merge)ํจ
- ์กฐํ ๋ฒ์๊ฐ ๋ง์ ๋ ์ฌ์ฉํ๋ ์กฐ์ธ ๋ฐฉ๋ฒ๋ก . ์ฃผ๋ก ์กฐ์ธ ์กฐ๊ฑด ์นผ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋, ์ถ๋ ฅํด์ผ ํ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ง์ ๋ ์ฌ์ฉ๋จ.
- Nest Loop Join์ ์กฐ์ธ ๋ฐฉ์๊ณผ ์ฅ๋จ์ ๋ฉด์์ ์๋ฐ๋ ๋งค๋ ฅ์ ๊ฐ์ง.
- ์ ๋ ฌ ๋ฐ์ดํฐ ์์ด ๋๋ฌด ๋ง์ผ๋ฉด, ์ ๋ ฌ์ ์์ ์์ญ์์ ์ํ๋จ. ์์ ์์ญ์ ๋์คํฌ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ๋จ์ด์ง.
์ฌ์ฉ๋ฒ ์์
select /* ordered use_merge(A B)*/ A.Color, B.SIZE,...
from TABLE_A A,TABLE_B B
where a.joinkey_a = b.joinkey_b -- join key์ ๋ํ ์ธ๋ฑ์ค๊ฐ ํ
์ด๋ธ ๋ ๋ชจ๋ ๋ค ์์
and a.color = 'RED' --์ธ๋ฑ์ค ์์
and b.size = 'MED'; --์ธ๋ฑ์ค ์์
์ฌ์ฉํ๋ ์ผ์ด์ค
1. ์ฐ๊ฒฐ ๊ณ ๋ฆฌ์ ์ธ๋ฑ์ค๊ฐ ์ ํ ์๋ ๊ฒฝ์ฐ
2. ๋์ฉ๋์ ์๋ฃ๋ฅผ ์กฐ์ธํ ๋
3. ์กฐ์ธ ์กฐ๊ฑด์ผ๋ก >, <, <=, >= ์ ๊ฐ์ ๋ฒ์ ๋น๊ต ์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ
4. ์ธ๋ฑ์ค ์ฌ์ฉ์ ๋ฐ๋ฅธ ๋๋ค ์์ธ์ค์ ์ค๋ฒํค๋๊ฐ ๋ง์ ๊ฒฝ์ฐ
์ฑ๋ฅ ๊ฐ์ ํฌ์ธํธ
1. Access ํ๋ ์๋๋ฅผ ํฅ์ ์ํจ๋ค.
ํ ์ด๋ธ์ Access ํ ๋ Full table scan์ด๋ Index Range Scan์ด๋ ํ๋ ๋ฑ์ ํ ์ด๋ธ ์์ธ์ค ํ๋ ๋ฐฉ๋ฒ์ ํตํ์ฌ ์ต์ ํ ์ํจ๋ค๋ฉด Sort Merge Join์ ์๋๋ ์์ฐ์ค๋ฝ๊ฒ ์ต์ ํํ ์ ์์
2. ์ ๋ ฌ ์๋์ ํฅ์
3. ์์ชฝ์ ์ ๋ ฌ๊น์ง ์๋ฃ๋๋ ์๋๋ฅผ ๋ง์ถฐ์ค๋ค.
์์ชฝ ํ ์ด๋ธ์ access ํ๊ณ ์กฐํ๋ ๋ฐ์ดํฐ๋ค์ ์ ๋ ฌํ ๋์, ์ด๋ ํ ์ชฝ์ด๋ผ๋ ์ ๋ ฌ ์์ ์ด ์ข ๋ฃ๋์ง ์์ผ๋ฉด ํ ์ชฝ์ด ๋๊ธฐ ์ํ๊ฐ ๋๊ณ , ๋ค๋ฅธ ํ์ชฝ์ ์ ๋ ฌ์ด ์์ ํ ๋๋ ๋๊น์ง ์กฐ์ธ์ด ์์๋ ์ ์์. ๋น๊ตํด์ผ ํ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์์ด๋ ์ ๋ ฌ ์๋๋ฅผ ์ต๋ํ ๋ง์ถฐ์ฃผ๋ ๊ฒ์ด ํจ์จ์ .
4. SORT_AREA_SIZE ์ต์ ํ
Hash ์กฐ์ธ
- ๋ ๊ฐ์ ํ ์ด๋ธ ์ค ์์ ํ ์ด๋ธ์ Hash ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํ๊ณ , ๋ ๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํค๋ฅผ ์ฌ์ฉํด์ ํด์ ํ ์ด๋ธ์ ์์ฑํจ.
- ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์๋ฅผ ๊ณ์ฐํ๊ณ , ํด๋น ์ฃผ์๋ฅผ ์ฌ์ฉํด์ ํ ์ด๋ธ์ ์กฐ์ธํ๊ธฐ ๋๋ฌธ์ CPU ์ฐ์ฐ์ ๋ง์ด ํจ.
- ์ฃผ๋ก ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋จ.
์ฌ์ฉ๋ฒ ์์
select /* + ordered use_hash(b) */ *
from emp a, dept b
where a.DEPTNO = b.DEPTNO
and a.DEPTNO = 10 ;
์ฌ์ฉํ๋ ์ผ์ด์ค
1. Join ์ปฌ๋ผ์ ์ ๋นํ ์ธ๋ฑ์ค๊ฐ ์์ด nested loop ์กฐ์ธ ๊ฑฐ๋ ๊ฒ ๋นํจ์จ์ ์ผ ๋
2. Join Access ์์ด ๋ง์ด Random Access ๋ถํ๊ฐ ์ฌํ์ฌ nested loop๊ฐ ๋นํจ์จ์ ์ผ ๋
3. Sort Merge Join์ ํ๊ธฐ์๋ ๋ ํ ์ด๋ธ์ด ๋๋ฌด ์ปค Sort ๋ถํ๊ฐ ์ฌํ ๋
4. ์ํ ๋น๋๊ฐ ๋ฎ๊ณ ์ฟผ๋ฆฌ ์ํ ๊ธฐ๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋์ฉ๋ ํ ์ด๋ธ์ JOINํ ๋
์ฑ๋ฅ ๊ฐ์ ํฌ์ธํธ
1. Hash Table์ ๋ง๋๋ ๊ณผ์ ์ ํจ์จํํ๋ค.
Hash Table๋ก ๋ง๋ค Build Input์ด Hash Area์ ๋ด๊ธธ ์ ๋๋ก ์ถฉ๋ถํ ์์์ผ ํ๋ฉฐ, Build Input ํด์ ํค ์ปฌ๋ผ์ ์ค๋ณต ๊ฐ์ด ๊ฑฐ์ ์์ด์ผ ํจ์จ์ ์ธ ๋์์ ๊ธฐ๋ํ ์ ์์.
2. CPU์ ์ฑ๋ฅ์ ํฅ์ํ๋ค.
3. ์ถฉ๋ถํ PGA ๋ฉ๋ชจ๋ฆฌ ํ๋ณด