๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜

-- ์‚ฌ์› ํ…Œ์ด๋ธ” ๊ธฐ์ค€(ordered)์œผ๋กœ ๊ณ ๊ฐ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•  ๋•Œ ํ•ด์‹œ ์กฐ์ธ(use_hash) ํ•˜๋ผ
select /*+ ordered use_hash(c) */
       e.์‚ฌ์›๋ฒˆํ˜ธ, e.์‚ฌ์›๋ช…, e.์ž…์‚ฌ์ผ์ž
     , c.๊ณ ๊ฐ๋ฒˆํ˜ธ, c.๊ณ ๊ฐ๋ช…, c.์ „ํ™”๋ฒˆํ˜ธ, c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก
from   ์‚ฌ์› e, ๊ณ ๊ฐ c
where  c.๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ = e.์‚ฌ์›๋ฒˆํ˜ธ
and    e.์ž…์‚ฌ์ผ์ž     >= '19960101'
and    e.๋ถ€์„œ์ฝ”๋“œ     = 'Z123'
and    c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก >= 20000
img
Build
select ์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›๋ช…, ์ž…์‚ฌ์ผ์ž
from   ์‚ฌ์›
where  ์ž…์‚ฌ์ผ์ž >= '19960101'
and    ๋ถ€์„œ์ฝ”๋“œ = 'Z123'
select ๊ณ ๊ฐ๋ฒˆํ˜ธ, ๊ณ ๊ฐ๋ช…, ์ „ํ™”๋ฒˆํ˜ธ, ์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก, ๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ
from   ๊ณ ๊ฐ
where  ์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก >= 20000
begin
  for outer in (select ๊ณ ๊ฐ๋ฒˆํ˜ธ, ๊ณ ๊ฐ๋ช…, ์ „ํ™”๋ฒˆํ˜ธ, ์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก, ๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ
                from   ๊ณ ๊ฐ
                where  ์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก >= 20000)
  loop    -- outer ๋ฃจํ”„
    for inner in (select ์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›๋ช…, ์ž…์‚ฌ์ผ์ž
                  from   PGA์—_์ƒ์„ฑํ•œ_์‚ฌ์›_ํ•ด์‹œ๋งต
                  where  ์‚ฌ์›๋ฒˆํ˜ธ = outer.๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ)
    loop  -- inner ๋ฃจํ”„
      dbms_output.put_line( ... );
    end loop;
  end loop;
end;
img
Probe

ํ•ด์‹œ ์กฐ์ธ์ด ๋น ๋ฅธ ์ด์œ 

ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๋‹ด๊ธฐ๋Š” ์ •๋ณด

๋Œ€์šฉ๋Ÿ‰ Build Input ์ฒ˜๋ฆฌ

img

ํ•ด์‹œ ์กฐ์ธ ์‹คํ–‰๊ณ„ํš ์ œ์–ด

-- ์œ„์ชฝ ํ…Œ์ด๋ธ”์„ Build Input์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ ํ›„, ์•„๋ž˜์ชฝ ํ…Œ์ด๋ธ”(Probe Input)์—์„œ ์ฝ์€ ์กฐ์ธ ํ‚ค๊ฐ’์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์กฐ์ธ
-- Build/Probe Input์„ ์ฝ์„ ๋•Œ ์ธ๋ฑ์Šค ์ด์šฉ(Table Full Scan๋„ ๊ฐ€๋Šฅ)
Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=ALL_ROWS
1   0    HASH JOIN
2   1      TABLE ACCESS (BY INDEX ROWID) OF '์‚ฌ์›' (TABLE)
3   2        INDEX (RANGE SCAN) OF '์‚ฌ์›_X1' (INDEX)
4   1      TABLE ACCESS (BY INDEX ROWID) OF '๊ณ ๊ฐ' (TABLE)
5   4        INDEX (RANGE SCAN) OF '๊ณ ๊ฐ_N1' (INDEX)

-- use_hash ํžŒํŠธ๋กœ ์ œ์–ด
-- use_hash๋งŒ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ, Build Input์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๊ฒฐ์ •(๋ณดํ†ต ๊ฐ ํ…Œ์ด๋ธ” ์กฐ๊ฑด์ ˆ์— ๋Œ€ํ•œ ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ์ž‘์€ ํ…Œ์ด๋ธ”)
select /*+ use_hash(e c) */
       e.์‚ฌ์›๋ฒˆํ˜ธ, e.์‚ฌ์›๋ช…, e.์ž…์‚ฌ์ผ์ž
     , c.๊ณ ๊ฐ๋ฒˆํ˜ธ, c.๊ณ ๊ฐ๋ช…, c.์ „ํ™”๋ฒˆํ˜ธ, c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก
from   ์‚ฌ์› e, ๊ณ ๊ฐ c
where  c.๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ = e.์‚ฌ์›๋ฒˆํ˜ธ
and    e.์ž…์‚ฌ์ผ์ž     >= '19960101'
and    e.๋ถ€์„œ์ฝ”๋“œ     = 'Z123'
and    c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก >= 20000

-- leading/ordered๋กœ Build Input ์ง€์‹œ ๊ฐ€๋Šฅ(ํžŒํŠธ๋กœ ์ง€์‹œํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฐ€์žฅ ๋จผ์ € ์ฝ๋Š” ํ…Œ์ด๋ธ”)
select /*+ leading(e) use_hash(c) */ -- ๋˜๋Š” ordered use_hash(c)
       e.์‚ฌ์›๋ฒˆํ˜ธ, e.์‚ฌ์›๋ช…, e.์ž…์‚ฌ์ผ์ž
     , c.๊ณ ๊ฐ๋ฒˆํ˜ธ, c.๊ณ ๊ฐ๋ช…, c.์ „ํ™”๋ฒˆํ˜ธ, c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก
from   ์‚ฌ์› e, ๊ณ ๊ฐ c
where  c.๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ = e.์‚ฌ์›๋ฒˆํ˜ธ
and    e.์ž…์‚ฌ์ผ์ž     >= '19960101'
and    e.๋ถ€์„œ์ฝ”๋“œ     = 'Z123'
and    c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก >= 20000

-- swap_join_inputs๋กœ Build Input ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ ๊ฐ€๋Šฅ
select /*+ leading(e) use_hash(c) swap_join_inputs(c) */
       e.์‚ฌ์›๋ฒˆํ˜ธ, e.์‚ฌ์›๋ช…, e.์ž…์‚ฌ์ผ์ž
     , c.๊ณ ๊ฐ๋ฒˆํ˜ธ, c.๊ณ ๊ฐ๋ช…, c.์ „ํ™”๋ฒˆํ˜ธ, c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก
from   ์‚ฌ์› e, ๊ณ ๊ฐ c
where  c.๊ด€๋ฆฌ์‚ฌ์›๋ฒˆํ˜ธ = e.์‚ฌ์›๋ฒˆํ˜ธ
and    e.์ž…์‚ฌ์ผ์ž     >= '19960101'
and    e.๋ถ€์„œ์ฝ”๋“œ     = 'Z123'
and    c.์ตœ์ข…์ฃผ๋ฌธ๊ธˆ์•ก >= 20000

์„ธ ๊ฐœ ์ด์ƒ ํ…Œ์ด๋ธ” ํ•ด์‹œ ์กฐ์ธ

select /*+ leading(T1, T2, T3) use_hash(T2) use_hash(T3) */
from   T1, T2, T3
where  T1.key = T2.key
and    T2.key = T3.key

์กฐ์ธ ๋ฉ”์†Œ๋“œ ์„ ํƒ ๊ธฐ์ค€

img