01D
Less than 1 minute
01D ๊ด๋ จ
์ธ๋ฑ์ค ๊ธฐ๋ณธ ์๋ฆฌ
B*Tree ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ฒ์ ์ค์บ ์์์ง์ ์ ์ฐพ๊ธฐ ์ํด ๋ฃจํธ ๋ธ๋ก๋ถํฐ ๋ฆฌํ๋ธ๋ก๊น์ง์ ์์ง์ ํ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํจ
์ธ๋ฑ์ค ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ ํ๊ฑฐ๋ ๋ฒ์ ์ค์บ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ
- ์ ์์ ์ธ ์ธ๋ฑ์ค ๋ฒ์ ์ค์บ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ(Index Full Scan์ ๊ฐ๋ฅ)
- ์ธ๋ฑ์ค ์ปฌ๋ผ์ ์กฐ๊ฑด์ ์์ ๊ฐ๊ณต:
WHERE SUBSTR(์ ์ฒด๋ช , 1, 2) = '๋ํ'
- ๋ถ์ ํ ๋น๊ต:
WHERE ์ง์ <> 'ํ์'
IS NOT NULL
์กฐ๊ฑด๋ ๋ถ์ ํ ๋น๊ต์ ํด๋น:WHERE ๋ถ์์ฝ๋ IS NOT NULL
- '๋ถ์์ฝ๋'์ ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ค๋ฉด ์ธ๋ฑ์ค ์ ์ฒด ์ค์บ์ ํตํด ์ป์ ๋ ์ฝ๋๋ ๋ชจ๋ '
๋ถ์์ฝ๋ IS NOT NULL
' ์กฐ๊ฑด์ ๋ง์กฑ.
- '๋ถ์์ฝ๋'์ ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ค๋ฉด ์ธ๋ฑ์ค ์ ์ฒด ์ค์บ์ ํตํด ์ป์ ๋ ์ฝ๋๋ ๋ชจ๋ '
- ์ธ๋ฑ์ค ์ปฌ๋ผ์ ์กฐ๊ฑด์ ์์ ๊ฐ๊ณต:
- ์ธ๋ฑ์ค ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ
IS NULL
์กฐ๊ฑด๋ง์ผ๋ก ๊ฒ์ํ ๋:where ์ฐ๋ฝ์ฒ is null
- ์์ธ์ ์ผ๋ก ํด๋น ์ปฌ๋ผ์ด
not null
์ ์ฝ์ด ์์ ๊ฒฝ์ฐ Table Full Scan์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ.
- ์์ธ์ ์ผ๋ก ํด๋น ์ปฌ๋ผ์ด
IS NULL
์กฐ๊ฑด์ ์ฌ์ฉํ๋๋ผ๋ ๋ค๋ฅธ ์ธ๋ฑ์ค ๊ตฌ์ฑ ์ปฌ๋ผ์is null
์ด์ธ์ ์กฐ๊ฑด์์ด ํ๋๋ผ๋ ์์ผ๋ฉด Index Range Scan ๊ฐ๋ฅ (์ธ๋ฑ์ค ์ ๋ ์ปฌ๋ผ์ด ์กฐ๊ฑด๊ฑธ์ ๋๋ฝ๋์ง ์์์ผ ํ๋ค)emp_idx : job + deptno where job is null and deptno = 20
์ธ๋ฑ์ค ์ปฌ๋ผ์ ๊ฐ๊ณต
์ธ๋ฑ์ค ์ปฌ๋ผ ๊ฐ๊ณต ์ฌ๋ก | ํ๋ ๋ฐฉ์ |
---|---|
substr(์
์ฒด๋ช
, 1, 2) = '๋ํ' | ์
์ฒด๋ช
like '๋ํ%' |
์๊ธ์ฌ * 12 = 36000000 | ์๊ธ์ฌ = 36000000 / 12 |
to_char(์ผ์, 'yyyymmdd') = :dt | ์ผ์ >= to_date(:dt, 'yyyymmdd') and ์ผ์ < to_date(:dt, 'yyyymmdd') + 1 |
`์ฐ๋ น | |
`ํ์๋ฒํธ | |
nvl(์ฃผ๋ฌธ์๋, 0) >= 100 | ์ฃผ๋ฌธ์๋ >= 100 |
nvl(์ฃผ๋ฌธ์๋, 0) < 100 | create index ์ฃผ๋ฌธ_x01 on ์ฃผ๋ฌธ(nvl(์ฃผ๋ฌธ์๋, 0) ); |
not null ์ปฌ๋ผ์ด๋ฉด nvl ์ ๊ฑฐ, ์๋๋ฉด ํจ์๊ธฐ๋ฐ ์ธ๋ฑ์ค(FBI) ์์ฑ ๊ณ ๋ ค |
ํ๋์ฌ๋ก1
์ผ๋ณ์ง์์ ์ข ๋ณ๊ฑฐ๋๋ฐ์์ธ_PK : ์ง์๊ตฌ๋ถ์ฝ๋ + ์ง์์ ์ข ์ฝ๋ + ๊ฑฐ๋์ผ์ ์ผ๋ณ์ง์์ ์ข ๋ณ๊ฑฐ๋๋ฐ์์ธ_X01 : ๊ฑฐ๋์ผ์
๊ฑฐ๋์ผ์ between :startDd and :endDd
and ์ง์๊ตฌ๋ถ์ฝ๋ || ์ง์์
์ข
์ฝ๋ in ('1001', '2003'); => ๊ฑฐ๋์ผ์ ์ธ๋ฐ์ค ์ฌ์ฉ ํน์ Full Table Scan
=>
๊ฑฐ๋์ผ์ between :startDd and :endDd
and (์ง์๊ตฌ๋ถ์ฝ๋, ์ง์์
์ข
์ฝ๋) in (('1', '001'), ('2', '003')); => PK ์ธ๋ฑ์ค ์ฌ์ฉ
ํ๋์ฌ๋ก2
์ ์์ ๋ณดํ์ผ_PK : ์์ ๋ฒํธ ์ ์์ ๋ณดํ์ผ_X01 : ์ ์ ๋์์ ์๋ฒํธ + ๊ธ๊ฐ์์ ์๋ฒํธ
decode(์ ์ ๋์์ ์๋ฒํธ, lpad(' ', 14), ๊ธ๊ฐ์์ ์๋ฒํธ, ์ ์ ๋์์ ์๋ฒํธ) = :์ ์๋ฒํธ => Full Table Scan
=>
์ ์ ๋์์ ์๋ฒํธ in (:์ ์๋ฒํธ, lpad(' ', 14))
and ๊ธ๊ฐ์์ ์๋ฒํธ = decode(์ ์ ๋์์ ์๋ฒํธ, lpad(' ', 14), :์ ์๋ฒํธ, ๊ธ๊ฐ์์ ์๋ฒํธ)
=> ์ ์์ ๋ณดํ์ผ_X01 Index Range Scan
๋ฐ์ดํฐํ์ ์ฐ์ ์์
- ์ซ์ํ > ๋ฌธ์ํ
- ๋ ์งํ > ๋ฌธ์ํ
์์ 1
select * from EMP WHERE 1=1 AND empno || '' = 7900;
select * from table(dbms_xplan.display);
์์ 2
explain plan for
SELECT * FROM EMP WHERE 1=1 AND empno = 7900;
SELECT * FROM table(dbms_xplan.display);
์์ 3
explain plan for
SELECT * FROM EMP WHERE 1=1 AND empno = '7900';
SELECT * FROM table(dbms_xplan.display);