๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Round and Round
DB/SQLP

[SQLP] 2-2. ์ธ๋ฑ์Šค ํ™œ์šฉ

by ํ‰๊ธ€ํ‰๊ธ€ 2025. 2. 23.

๐Ÿงท ์ธ๋ฑ์Šค ํ™œ์šฉ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์‹ค์ œ ์„ฑ๋Šฅ ํ–ฅ์ƒ ํšจ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

๐Ÿ–‡๏ธ ์ธ๋ฑ์Šค ์Šค์บ” ๋ฐฉ์‹

์ธ๋ฑ์Šค๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌํ”„(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 - UNION ALL

 

OR Expansion์€ OR ์กฐ๊ฑด์‹์„ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. use_concatํžŒํŠธ๋ฅผ ํ†ตํ•ด OR Expansion๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

OR Expansion

 

โ‘ก IN ์—ฐ์‚ฐ์ž

 

IN ์กฐ๊ฑด ์—ญ์‹œ ์‹œ์ž‘์ ์„ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ Index Range Scan์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” IN-List Iterator ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ IN-List ๊ฐœ์ˆ˜๋งŒํผ Index Range Scan์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์€ use_concat ํžŒํŠธ๋ฅผ ํ†ตํ•ด ์œ ๋„ํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐ ์กฐ๊ฑด๋ณ„๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

IN lterator

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 ์—ฐ์‚ฐ ์ƒ๋žต

 

์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•ด ๋ณด๋ฉด, ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ฒฝ์šฐ ๋ณ„๋„์˜ SORT ORDER BY ๋‹จ๊ณ„ ์—†์ด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€์ ์ธ ์ •๋ ฌ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๋‚ด๋ฆผ์ฐจ์ˆœ(DESC) ์ •๋ ฌ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ •๋ ฌ ์—ฐ์‚ฐ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค์˜ Leaf ๋ธ”๋ก์€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์–ด, ์–‘ ๋ฐฉํ–ฅ์—์„œ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

  • ์˜ค๋ฆ„์ฐจ์ˆœ(ASC) ์ •๋ ฌ: ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„ ์ขŒ์ธก์œผ๋กœ ์ˆ˜์ง ํƒ์ƒ‰ํ•œ ํ›„, ์šฐ์ธก์œผ๋กœ ์ˆ˜ํ‰ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ๋‚ด๋ฆผ์ฐจ์ˆœ(DESC) ์ •๋ ฌ: ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์•„ ์šฐ์ธก์œผ๋กœ ์ˆ˜์ง ํƒ์ƒ‰ํ•œ ํ›„, ์ขŒ์ธก์œผ๋กœ ์ˆ˜ํ‰ ํƒ์ƒ‰ํ•œ๋‹ค.

Sort ์—ฐ์‚ฐ ์—ญ์ˆœ ์ƒ๋žต

 

์ฆ‰, ๋‹จ์ˆœํžˆ ํƒ์ƒ‰ ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ ์กฐ์ •ํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ์‹คํ–‰ ๊ณ„ํš์—์„œ๋Š” 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 ์ ˆ์—์„œ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์— ํ•จ์ˆ˜ ๋“ฑ ๊ฐ€๊ณต ์ฒ˜๋ฆฌ๊ฐ€ ์ ์šฉ๋˜๋ฉด ์ •๋ ฌ ์—ฐ์‚ฐ ์ƒ๋žต์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Sort ์—ฐ์‚ฐ ์ƒ๋žต ๋ฌธ์ œ

 

โ‘ก alias ๋ณ„์นญ ์‚ฌ์šฉ

 

์•„๋ž˜์™€ ๊ฐ™์ด, SELECT ์ ˆ์—์„œ ๊ฐ€๊ณต๋œ ์ปฌ๋Ÿผ์„ ORDER BY์—์„œ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•˜๋ฉด SORT ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

Sort ์—ฐ์‚ฐ ์ƒ๋žต ๋ฌธ์ œ

 

ORDER BY ์ ˆ์—์„œ ์‚ฌ์šฉ๋œ ORDER_DATE ์ปฌ๋Ÿผ์ด, SELECT ์ ˆ์—์„œ ๊ฐ€๊ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š”, ORDER BY์ ˆ์˜ o.ORDER_DATE ์ฒ˜๋Ÿผ alias๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•ด ์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

 

Sort ์—ฐ์‚ฐ ์ƒ๋žต ๋ฌธ์ œ

 

(2) SELECT-LIST

 

๊ฒฐํ•ฉ ์ธ๋ฑ์Šค๊ฐ€ [STATUS + CUSTOMER_ID + ORDER_DATE]๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ, ์กฐ๊ฑด์ ˆ์˜ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ๊ฐ€๊ณต๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ์ธ๋ฑ์Šค์˜ ์ตœ์†Œ๊ฐ’(MIN) ๋˜๋Š” ์ตœ๋Œ€๊ฐ’(MAX)์„ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค์˜ Leaf ๋ธ”๋ก์—์„œ ๋‹จ ํ•œ ๊ฑด์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ์ฝ์–ด๋„ ๋˜๋ฏ€๋กœ, ์‹คํ–‰ ๊ณ„ํš์—์„œ๋Š” FIRST ROW ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

SELECT-LIST

 

โ‘  ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ๊ฐ€๊ณต

 

๋งŒ์•ฝ SELECT ๋ฆฌ์ŠคํŠธ์—์„œ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์— ํ•จ์ˆ˜ ๋“ฑ ๊ฐ€๊ณต ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด, ์ด๋ฏธ ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์‹œ ๋ฌธ์ž์—ด ๋“ฑ ๋‹ค๋ฅธ ๊ธฐ์ค€์œผ๋กœ ์žฌ์ •๋ ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ SORT ์—ฐ์‚ฐ์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

 

SELECT-LIST

 

๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์€ MIN ๋˜๋Š” MAX์™€ ๊ฐ™์€ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ง‘๊ณ„ ํ›„์— ์ˆ˜ํ–‰ํ•˜๋ฉด, ์ •๋ ฌ ์—ฐ์‚ฐ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
TO_CHAR(MAX(o.ORDER_DATE), 'YYYYMMDD')์™€ ๊ฐ™์ด ์ง‘๊ณ„ ํ›„ ๊ฐ€๊ณตํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ •์ƒ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ก ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ Unnesting

 

์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ๋„ MIN/MAX์™€ FIRST ROW ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋‹ค๋งŒ, Oracle 12c ์ด์ƒ์—์„œ๋Š” ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ Unnesting์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด NO_UNNEST ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

 

SELECT-LIST

 

ํ•˜์ง€๋งŒ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณตํ•ด์„œ ์ฝ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด CONCAT ๋“ฑ์œผ๋กœ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์„ ๊ฐ€๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์—๋„, ์ธ๋ฑ์Šค์˜ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†์–ด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.