๐งท ์ธ๋ฑ์ค ํ์ฉ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค. ํ์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋๋์ ๋ฐ๋ผ ์ค์ ์ฑ๋ฅ ํฅ์ ํจ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค.
๐๏ธ ์ธ๋ฑ์ค ์ค์บ ๋ฐฉ์
์ธ๋ฑ์ค๋ ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋ฆฌํ(Leaf) ๋ธ๋ก์์ ์ค์บ ์์์ ๋ถํฐ ๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ง์ ๊น์ง ์ค๊ฐ์ ์ค์บ์ ์ค๋จํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ Index Range Scan์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ์ค์บ ์์์ ๊ณผ ์ข ๋ฃ์ ์ ๋ช ํํ ํ์ ํ์ฌ ํ์ํ ๋ถ๋ถ๋ง ์ฝ์ด ๋ค์์ ์๋ฏธํ๋ค. ๋ฐ๋ฉด, ์ธ๋ฑ์ค ์ ์ฒด๋ฅผ ์์ฐจ์ ์ผ๋ก ์ค์บํ๋ ๊ฒฝ์ฐ๋ฅผ Index Full Scan์ด๋ผ๊ณ ํ๋ค.
(1) Index Range Scan
SELECT EMPNO
FROM EMP
WHERE NAME LIKE 'ABD%'
Leaf ๋ธ๋ก
[ABC] [ABE] [ABF]
↑
์ค์บ ์ ์ง
์ธ๋ฑ์ค๋ ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, 'ABD%'์ ํด๋นํ๋ ๊ฐ์ [ABE] ์ดํ์ ์กด์ฌํ์ง ์์์ ์ ์ ์๋ค. ๋ฐ๋ผ์ ์์์ ๊ณผ ์ข ๋ฃ์ ์ ๋ช ํํ ๊ฒฐ์ ํ ์ ์์ด ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
(2) Index Full Scan
SELECT EMPNO
FROM EMP
WHERE NAME LIKE '%ABD%'
Leaf ๋ธ๋ก
[ABC] [ABE] [ABF]
↑
์ค์บ ์ ์ง ๋ถ๊ฐ
์กฐ๊ฑด์ ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์์ง๋ง, '%ABD%'์ฒ๋ผ ํจํด์ ์์์ด ์์ผ๋์นด๋๋ก ๋์ด ์์ผ๋ฉด [ABE] ์ดํ์ ํด๋น ํจํด์ด ์กด์ฌํ๋์ง ์ ์ ์์ผ๋ฏ๋ก ์ค์บ ์ค๊ฐ์ ๋ฉ์ถ ์ ์๋ค. ์ฆ, ์ค์บ ์์์ ๊ณผ ์ข ๋ฃ์ ์ ํ์ ํ ์ ์์ด ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ๋ค๊ณ ๋ณด๊ธฐ๋ ์ด๋ ต๋ค.
๐๏ธ ์ธ๋ฑ์ค ์ฌ์ฉ ์กฐ๊ฑด
B * Tree ์ธ๋ฑ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด, ์ธ๋ฑ์ค์ ์ ๋ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฃจํธ ๋ธ๋ก๋ถํฐ ๋ฆฌํ ๋ธ๋ก๊น์ง ์์ง ํ์ํ์ฌ ๋ฒ์ ์ค์บ์ ์์์ ์ ์ฐพ์์ผ ํ๋ค. ๋ง์ฝ ์ ๋ ์ปฌ๋ผ์ด ์กฐ๊ฑด์ ์ ํฌํจ๋์ง ์๊ฑฐ๋ ๊ฐ๊ณต๋์ด ์๋ค๋ฉด, ์ตํฐ๋ง์ด์ ๋ ์ธ๋ฑ์ค ์ ์ฒด ๋๋ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ค์บํ๊ฒ ๋์ด ํจ์จ์ฑ์ด ํฌ๊ฒ ๋จ์ด์ง๋ค.
์ฆ, ์ค์บ ์์์ ๊ณผ ์ข ๋ฃ์ ์ ๋ช ํํ ์ ์ ์์ด์ผ ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค๊ณ ํ๋จํ ์ ์๋ค.
1. ์ธ๋ฑ์ค ์ฌ์ฉ ์กฐ๊ฑด
ํจ์จ์ ์ธ ์ธ๋ฑ์ค ์ฌ์ฉ์ ์ํด์๋ ๊ฐ๊ณต๋์ง ์์ ์ธ๋ฑ์ค์ ์ ๋ ์ปฌ๋ผ์ด ์กฐ๊ฑด์ ์ ํฌํจ๋์ด์ผ ํ๋ค.
์ธ๋ฑ์ค ์ปฌ๋ผ์ ๊ฐ๊ณต์ด ๊ฐํด์ง๊ฑฐ๋, ์ ๋ ์ปฌ๋ผ์ด ์กฐ๊ฑด์ ์ ๋ช
์๋์ง ์์ผ๋ฉด Range Scan์ด ๋ฐ์ํ์ง ์๋๋ค. ๋ฐ๋๋ก, ์ธ๋ฑ์ค ์ ๋ ์ปฌ๋ผ์ด ๊ฐ๊ณต๋์ง ์์ ์ํ๋ก ์กฐ๊ฑด์ ์ ์๋ค๋ฉด Index Range Scan์ ๋ฌด์กฐ๊ฑด ๊ฐ๋ฅํ๋ค.
๋จ, Index Range Scan์ ์ํํ๋ค๊ณ ํด์ ํญ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ค๊ณ ๋ณผ ์๋ ์๋ค. ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ค์บํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ด ์ง๋์น๊ฒ ๋ง๋ค๋ฉด, ์ค์ ์ฑ๋ฅ ํฅ์ ํจ๊ณผ๋ ๋ฏธ๋ฏธํ ์ ์๋ค. ๋ฐ๋ผ์ ์ธ๋ฑ์ค ์ฌ์ฉ ์, Leaf ๋ธ๋ก์์ ์ค์ ๋ก ์ค์บํ๋ ๋ฐ์ดํฐ์ ์์ ํ์ธํ๋ ๊ฒ์ด ์ค์ํ๋ค.
(1) ์ธ๋ฑ์ค ์ปฌ๋ผ ๊ฐ๊ณต
์ธ๋ฑ์ค ์ปฌ๋ผ์ ํจ์๋ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉด, ์ธ๋ฑ์ค ์ค์บ์ ์์์ ์ ์ฐพ๊ธฐ ์ด๋ ต๊ฒ ๋์ด ํจ์จ์ ์ธ Range Scan์ด ๋ถ๊ฐ๋ฅํด์ง๋ค.
- DAY BETWEEN '2023-12-01' AND '2023-12-31' → ์ค์บ ์์์ ๊ณผ ์ข ๋ฃ์ ์ ์ ํํ ์ ์ ์๋ค.
- SUBSTR(day, 5, 2) = '12' → ์ค์บ ์์์ ๊ณผ ๋์ง์ ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์บ์ ๋ฉ์ถ ์ ์๋ค.
(2) OR / IN ์ฐ์ฐ์
โ OR ์ฐ์ฐ์
OR ์กฐ๊ฑด์ ๋จ์ผ ๋ฒ์ ์ค์บ์ ์์์ ์ ์ฐพ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋, UNION ALL์ ํ์ฉํ๊ฑฐ๋ ์ตํฐ๋ง์ด์ ์ ์ฟผ๋ฆฌ ๋ณํ ๊ธฐ๋ฅ์ธ OR Expansion ์ ํตํด ๊ฐ ์กฐ๊ฑด์ ๋ถ๋ฆฌํ๋ฉด, ์ธ๋ฑ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
UNION ALL์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ ๊ฐ์ ํํ๋ก๋ก ๋ณํํ๋ฉด Index Range Scan์ ์๋์ํฌ ์ ์๋ค.
OR Expansion
์ OR ์กฐ๊ฑด์์ ์ตํฐ๋ง์ด์ ๊ฐ ์์ ๊ฐ์ ํํ๋ก ๋ณํํ ์ ์๋ค. use_concat
ํํธ๋ฅผ ํตํด OR Expansion๋ฅผ ์ ๋ํ ์ ์๋ค.
โก IN ์ฐ์ฐ์
IN ์กฐ๊ฑด ์ญ์ ์์์ ์ ๋ช
ํํ ํ์
ํ๊ธฐ ์ด๋ ค์ Index Range Scan์ด ์ด๋ ค์ธ ์ ์๋ค. ์ตํฐ๋ง์ด์ ๋ IN-List Iterator ๋ฐฉ์์ ์ฌ์ฉํ์ฌ IN-List ๊ฐ์๋งํผ Index Range Scan์ ๋ฐ๋ณต ์ํํ๋ค. ์ด ๊ณผ์ ์ use_concat
ํํธ๋ฅผ ํตํด ์ ๋ํ ์ ์์ด, ๊ฐ ์กฐ๊ฑด๋ณ๋ก ์ธ๋ฑ์ค๊ฐ ์ ์์ ์ผ๋ก ํ์ฉํ ์ ์๋ค.
2. ์ธ๋ฑ์ค ๋น์ ์์ ์ฌ์ฉ
์ธ๋ฑ์ค ์ปฌ๋ผ์ ํจ์๋ ๊ธฐํ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ์กฐ๊ฑด์ ์ ์ฌ์ฉํ๋ฉด, ์ธ๋ฑ์ค์ ํจ์จ์ ์ธ ํ์ฉ์ด ์ด๋ ต๋ค. ๋ํ, ๋ถ์ ํ ๋น๊ต ์ฐ์ฐ์(<> ๋๋!=)๋ is not null ์กฐ๊ฑด ์ญ์ ๋ถ์ ์กฐ๊ฑด์ผ๋ก ๊ฐ์ฃผ๋์ด ์ ์์ ์ธ ์ธ๋ฑ์ค ์ฌ์ฉ์ ์ ์ฝ์ ์ค๋๋ค. ๋ค๋ง, ์ด ์ธ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ๋ฑ์ค ๋ฒ์ ์ค์บ(index range scan)์ ๋ถ๊ฐ๋ฅํ ๋ฟ, ์ธ๋ฑ์ค ์ ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋ Index Full Scan์ ์ํํ ์ ์๋ค.
(1) IS NULL ์กฐ๊ฑด
is null ์กฐ๊ฑด๋ง์ผ๋ก ๊ฒ์ํ๋ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค๋ฟ ์๋๋ผ ๋ณตํฉ ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ์๋, ๊ตฌ์ฑ ์ปฌ๋ผ์ ๊ฐ์ด ๋ชจ๋ null์ด๋ฉด ์ธ๋ฑ์ค๋ง์ผ๋ก ์์ ํ ๊ฒฐ๊ณผ ์งํฉ์ ๋์ถํ ์ ์๊ธฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ฉด, is not null ์กฐ๊ฑด์ ๊ฒฝ์ฐ Oracle์์๋ ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค์ null ๊ฐ์ ์ ์ฅํ์ง ์์ผ๋ฏ๋ก, ์กฐ๊ฑด์ ํด๋นํ๋ ๋ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฐพ์ ์ ์์ด ์ธ๋ฑ์ค ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โ not null ์ ์ฝ
ํด๋น ์ปฌ๋ผ์ not null ์ ์ฝ ์กฐ๊ฑด์ด ์ค์ ๋์ด ์๋ค๋ฉด, is null ์กฐ๊ฑด์ ์ฌ์ฉํ๋๋ผ๋ ์ตํฐ๋ง์ด์ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๊ฐ ์์์ ์ธ์งํ๊ณ ์ธ๋ฑ์ค ์ค์บ์ ํตํด ๊ณต์งํฉ์ ๋ฐํํ ์ ์๋ค. ์ด๋ ๋ ผ๋ฆฌ์ ๋ชจ์์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋, Tabel Full Scan์ ํผํ๊ธฐ ์ํ ํธ๋ฆญ์ด๋ผ ๋ณผ ์ ์๋ค.
๋ํ, ๋ณตํฉ ์ธ๋ฑ์ค ๊ตฌ์ฑ ์ปฌ๋ผ ์ค ์ด๋ ํ๋๋ผ๋ not null ์ ์ฝ ์กฐ๊ฑด์ด ์๋ค๋ฉด, ํด๋น ์ปฌ๋ผ์ ์กฐ๊ฑด์ด ํฌํจ๋์ด ์์ง ์๋๋ผ๋ ํญ์ Index Range Scan์ด ๊ฐ๋ฅํด์ง๋ค
โก is null ์ด์ธ์ ์กฐ๊ฑด์
is null ์กฐ๊ฑด๊ณผ ํจ๊ป ๋ณตํฉ ์ธ๋ฑ์ค์ ๋ค๋ฅธ ๊ตฌ์ฑ ์ปฌ๋ผ์ is null ์ด์ธ์ ์กฐ๊ฑด์ด ์กด์ฌํ๋ฉด, ํด๋น ์ปฌ๋ผ์๋ null์ด ์๋ ๊ฐ์ด ์ ์ฅ๋๋ฏ๋ก Index Range Scan์ด ๊ฐ๋ฅํ๋ค. ์ด๋๋ ์ธ๋ฑ์ค ์ ๋ ์ปฌ๋ผ์ ๋ํ ์กฐ๊ฑด์ด ๋ฐ๋์ ํฌํจ๋์ด์ผ ํ๋ค.
์ฐธ๊ณ ๋ก, Oracle์ null ๊ฐ์ ์ธ๋ฑ์ค์ ๋งจ ๋ค์ ์ ์ฅํ๋ ๋ฐ๋ฉด, MSSQL์ ๋งจ ์์ ์ ์ฅ๋๋ค.
(3) ๋ฌต์์ ํ๋ณํ
๋ช ์์ ์ผ๋ก ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๊ฐ๊ณตํ์ง ์์๋๋ผ๋, ์ตํฐ๋ง์ด์ ๊ฐ ์๋ ํ๋ณํ์ ์ ์ฉํ๋ฉด์ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๊ฐ๊ณต์ด ๋ฐ์ํ ์ ์๋ค. ์ด๋ก ์ธํด Table Full Scan์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ๋ ์งํ๊ณผ ๋ฌธ์ํ ๋น๊ต: ๋ ์งํ์ผ๋ก ์๋ ํ๋ณํ
- ์ซ์ํ๊ณผ ๋ฌธ์ํ ๋น๊ต: ์ซ์ํ์ผ๋ก ์๋ ํ๋ณํ
- LIKE ์ฐ์ฐ์ ์ฌ์ฉ ์: ๋น๊ต๋๋ ๊ฐ์ด ๋ฌธ์ํ์ผ๋ก ์๋ ํ๋ณํ
์ธ๋ฑ์ค ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ๊ณผ ๋์ผํ ํ์์ผ๋ก ์กฐ๊ฑด์ ์ ์์ฑํ์ฌ, ๋ถํ์ํ ํ๋ณํ์ด ๋ฐ์ํ์ง ์๋๋ก ํด์ผ ํ๋ค.
โ๏ธ ํจ์ ๊ธฐ๋ฐ ์ธ๋ฑ์ค(FBI) ํ์ฉ
์ฑ๋ฅ ์ด์์ ์์ธ์ด ๋ฌต์์ ํ๋ณํ์ ์๋ค๋ฉด, ์ ์ฒด ํ๋ก๊ทธ๋จ์ ์์ ํ ์ฌ๋ ฅ์ด ๋ถ์กฑํ ๋ ์์ ํด๊ฒฐ์ฑ ์ผ๋ก ํจ์ ๊ธฐ๋ฐ ์ธ๋ฑ์ค(FBI)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
FBI๋ ํจ์๋ ํํ์์ ์ธ๋ฑ์ค ์ปฌ๋ผ์ผ๋ก ํ์ฉํจ์ผ๋ก์จ, ํ๋ณํ ๋ฌธ์ ๋ฅผ ํํผํ์ฌ ์ธ๋ฑ์ค ํจ์จ์ ๋์ด๋ ์ด๋ค. ๋ค๋ง, ์ด๋ ์์๋ฐฉํธ์ ๋ถ๊ณผํ๋ฏ๋ก, ๊ทธ๋ค์ง ๊ถ์ฅํ ๋งํ ํด๋ฒ์ ๋ชป๋๋ฏ๋ก ์ถํ ์ผ์ ์ ์ก์ ๋ฐ๋์ ๊ฐ์ ํด์ผ ํ๋ค.
๐๏ธ SORT ์ฐ์ฐ ์๋ต
์ธ๋ฑ์ค๋ ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์, Index Range Scan์ ์ํํ ๋ ๋ณ๋์ ์ ๋ ฌ(SORT) ์ฐ์ฐ ์์ด๋ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๋ฐํํ ์ ์๋ค. ํนํ, ์ธ๋ฑ์ค์ ์ ๋ ์ปฌ๋ผ์ ๋ํด ๋ชจ๋ '=' ์กฐ๊ฑด์ ์ฌ์ฉํ๋ฉด, ๊ฒฐ๊ณผ ์งํฉ์ด ์ธ๋ฑ์ค ์ ์ ์์๋๋ก ์ ๋ ฌ๋๋ฏ๋ก ์ตํฐ๋ง์ด์ ๋ ORDER BY ์ ์ ์ ๋ ฌ ์ฐ์ฐ์ ์๋ตํ ์ ์๋ค.
์คํ ๊ณํ์ ํ์ธํด ๋ณด๋ฉด, ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ๊ฒฝ์ฐ ๋ณ๋์ SORT ORDER BY ๋จ๊ณ ์์ด ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋์ง๋ง, ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ถ๊ฐ์ ์ธ ์ ๋ ฌ ๋จ๊ณ๋ฅผ ์ํํ๋ค.
๋ด๋ฆผ์ฐจ์(DESC) ์ ๋ ฌ์์๋ ๋์ผํ๊ฒ ์ ๋ ฌ ์ฐ์ฐ์ ์๋ตํ ์ ์๋ค. ์ธ๋ฑ์ค์ Leaf ๋ธ๋ก์ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ก ๋์ด ์์ด, ์ ๋ฐฉํฅ์์ ํ์์ด ๊ฐ๋ฅํ๋ค.
- ์ค๋ฆ์ฐจ์(ASC) ์ ๋ ฌ: ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ์ ์ข์ธก์ผ๋ก ์์ง ํ์ํ ํ, ์ฐ์ธก์ผ๋ก ์ํ ํ์ํ๋ค.
- ๋ด๋ฆผ์ฐจ์(DESC) ์ ๋ ฌ: ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ์ ์ฐ์ธก์ผ๋ก ์์ง ํ์ํ ํ, ์ข์ธก์ผ๋ก ์ํ ํ์ํ๋ค.
์ฆ, ๋จ์ํ ํ์ ๋ฐฉํฅ์ ๋ฐ๋๋ก ์กฐ์ ํ๋ฉด ๋๋ฏ๋ก, ์คํ ๊ณํ์์๋ SORT ORDER BY ์ฐ์ฐ ๋์ INDEX RANGE SCAN ๋จ๊ณ์ DESCENDING ์ต์ ์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โ๏ธ ์๋ต์ด ๋์ง ์๋ ๊ฒฝ์ฐ
๊ฒฐํฉ ์ธ๋ฑ์ค ๊ตฌ์ฑ์ด [STATUS + CUSTOMER_ID + ORDER_DATE]
์ผ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ SQL ๋ฌธ์์๋ ์ ๋ ฌ ์ฐ์ฐ์ด ์๋ต๋์ง ์๋๋ค.
SELECT *
FROM ORDERS o
WHERE o.STATUS = 'Pending'
AND o.CUSTOMER_ID BETWEEN 1 AND 100
ORDER BY o.ORDER_DATE
์ SQL์ CUSTOMER_ID ์ปฌ๋ผ์ด ๋ฒ์ ๊ฒ์ ์กฐ๊ฑด์ ํด๋นํจ์๋ ORDER BY ์ ์ ํฌํจ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค ์์๋๋ก ์ ๋ ฌ๋์ง ์๋๋ค.
์ฆ, ์ ๋ ฌ ์ฐ์ฐ์ ์๋ตํ๋ ค๋ฉด ์กฐ๊ฑด์ ์ ๋ชจ๋ ์ ๋ ์ปฌ๋ผ์ '=' ์กฐ๊ฑด์ ์ฌ์ฉํ๊ฑฐ๋, ORDER BY ์ ์ ์ธ๋ฑ์ค์ ์์๋ฅผ ์ ํํ๊ฒ ๋ฐ์ํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด,
- ์กฐ๊ฑด์ ์
ORDER_DATE
์ ๋ํ '=' ์กฐ๊ฑด์ ์ถ๊ฐ ORDER BY o.CUSTOMER_ID, o.ORDER_DATE
์ ๊ฐ์ด ์ธ๋ฑ์ค ์์๋ฅผ ์์ ํ ๋ฐ์
ํ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ผ ์ ๋ ฌ ์ฐ์ฐ์ ์๋ตํ ์ ์๋ค.
๐๏ธ ์กฐ๊ฑด ์ ์ด์ธ์ ์ปฌ๋ผ ๊ฐ๊ณต
์ธ๋ฑ์ค ์ปฌ๋ผ์ ํจ์๋ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉด, ํด๋น ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ํ์ฉํ ์ ์๋ค. ์ด๋ ์กฐ๊ฑด์ ๋ฟ๋ง ์๋๋ผ ORDER BY ์ ์ด๋ SELECT-LIST์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.
(1) ORDER BY ์ ์์์ ๊ฐ๊ณต
โ ORDER BY ์ ์์์ ๊ฐ๊ณต
๊ฒฐํฉ ์ธ๋ฑ์ค๊ฐ [STATUS + CUSTOMER_ID + ORDER_DATE]
๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ, ์กฐ๊ฑด์ ์ ์ ๋ ์ปฌ๋ผ์ ๊ฐ๊ณต๋์ง ์์๋๋ผ๋, ORDER BY ์ ์์ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ํจ์ ๋ฑ ๊ฐ๊ณต ์ฒ๋ฆฌ๊ฐ ์ ์ฉ๋๋ฉด ์ ๋ ฌ ์ฐ์ฐ ์๋ต์ด ๋ถ๊ฐ๋ฅํ๋ค.
โก alias ๋ณ์นญ ์ฌ์ฉ
์๋์ ๊ฐ์ด, SELECT ์ ์์ ๊ฐ๊ณต๋ ์ปฌ๋ผ์ ORDER BY์์ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ฉด SORT ์ฐ์ฐ์ด ๋ฐ์ํ๋ค.
ORDER BY ์ ์์ ์ฌ์ฉ๋ ORDER_DATE
์ปฌ๋ผ์ด, SELECT ์ ์์ ๊ฐ๊ณต๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋, ORDER BY์ ์ o.ORDER_DATE
์ฒ๋ผ alias๋ฅผ ์ ํํ ์ง์ ํด ์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
(2) SELECT-LIST
๊ฒฐํฉ ์ธ๋ฑ์ค๊ฐ [STATUS + CUSTOMER_ID + ORDER_DATE]
๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ, ์กฐ๊ฑด์ ์ ์ ๋ ์ปฌ๋ผ์ด ๊ฐ๊ณต๋์ง ์์ ์ํ๋ผ๋ฉด ์ธ๋ฑ์ค์ ์ต์๊ฐ(MIN) ๋๋ ์ต๋๊ฐ(MAX)์ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋ค. ์ธ๋ฑ์ค์ Leaf ๋ธ๋ก์์ ๋จ ํ ๊ฑด์ ๋ ์ฝ๋๋ง ์ฝ์ด๋ ๋๋ฏ๋ก, ์คํ ๊ณํ์์๋ FIRST ROW ์ ํ์ธ ํ ์ ์๋ค.
โ ์ธ๋ฑ์ค ์ปฌ๋ผ ๊ฐ๊ณต
๋ง์ฝ SELECT ๋ฆฌ์คํธ์์ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ํจ์ ๋ฑ ๊ฐ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉด, ์ด๋ฏธ ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋ฅผ ๋ค์ ๋ฌธ์์ด ๋ฑ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์ฌ์ ๋ ฌํด์ผ ํ๋ฏ๋ก SORT ์ฐ์ฐ์ ์๋ตํ ์ ์๋ค.
๋ฐ์ดํฐ ๊ฐ๊ณต์ MIN ๋๋ MAX์ ๊ฐ์ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ง๊ณ ํ์ ์ํํ๋ฉด, ์ ๋ ฌ ์ฐ์ฐ์ ์๋ตํ ์ ์๋ค. ์๋ฅผ ๋ค์ด,TO_CHAR(MAX(o.ORDER_DATE), 'YYYYMMDD')
์ ๊ฐ์ด ์ง๊ณ ํ ๊ฐ๊ณตํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ํ์ฉํ ์ ์๋ค.
โก ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ Unnesting
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์์๋ MIN/MAX์ FIRST ROW ์ ๊ทผ ๋ฐฉ์์ ์ ์์ ์ผ๋ก ์๋ํ๋ค. ๋ค๋ง, Oracle 12c ์ด์์์๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ Unnesting์ ๋ฐฉ์งํ๊ธฐ ์ํด NO_UNNEST
ํํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
ํ์ง๋ง ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ฉด ํ ์ด๋ธ์ ๋ฐ๋ณตํด์ ์ฝ์ด์ผ ํ๋ฏ๋ก ๋นํจ์จ์ ์ผ ์ ์๋ค. ๋ํ, ์ฌ๋ฌ ๊ฐ์ ์ถ๋ ฅํ๊ธฐ ์ํด CONCAT ๋ฑ์ผ๋ก ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๊ฐ๊ณตํ๋ ๊ฒฝ์ฐ์๋, ์ธ๋ฑ์ค์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
'DB > SQLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQLP] 2-3. ์ธ๋ฑ์คย ์ค์บย ๋ฐฉ์ (0) | 2025.03.05 |
---|---|
[SQLP] 2-1. ์ธ๋ฑ์ค ๊ตฌ์กฐ (0) | 2025.02.22 |
[SQLP] 1-5. I/O ๋ฉ์ปค๋์ฆ (0) | 2025.02.11 |
[SQLP] 1-4. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ์ต์ ํ (0) | 2025.02.09 |
[SQLP] 1-3. SQL ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ (0) | 2025.02.09 |