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

[SQLP] 2-3. ์ธ๋ฑ์Šค ์Šค์บ” ๋ฐฉ์‹

by ํ‰๊ธ€ํ‰๊ธ€ 2025. 3. 5.

๐Ÿงท ์ธ๋ฑ์Šค ์Šค์บ” ๋ฐฉ์‹

๐Ÿ–‡๏ธ Index Range Scan

์ธ๋ฑ์Šค ๋ฃจํŠธ ๋ธ”๋ก์—์„œ ๋ฆฌํ”„ ๋ธ”๋ก๊นŒ์ง€ ์ˆ˜์ง์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ ํ›„, ๋ฆฌํ”„ ๋ธ”๋ก์—์„œ ํ•„์š”ํ•œ ๋ฒ”์œ„๋งŒ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹

 

B * Tree ์ธ๋ฑ์Šค์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ์ •์ƒ์ ์ธ ํ˜•ํƒœ์˜ ์•ก์„ธ์Šค ๋ฐฉ์‹์ด๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์ˆ˜์ง์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ ํ›„ ๋ฆฌํ”„ ๋ธ”๋ก์—์„œ ํ•„์š”ํ•œ ๋ฒ”์œ„๋งŒ ์Šค์บ”ํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์€ ๋ฒ”์œ„ ์Šค์บ”์„ ์˜๋ฏธํ•œ๋‹ค.

 

Index Range Scan

 

Index Range Scan์ด ๋™์ž‘ํ•˜๋ ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์กฐ๊ฑด์ ˆ์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜๋ฉด Index Full Scan ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ, ์„ ๋‘ ์ปฌ๋Ÿผ์„ ๊ฐ€๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์กฐ๊ฑด Index Range Scan์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ํ•ญ์ƒ ์„ฑ๋Šฅ์ด ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
๊ฒฐ๊ตญ ์ธ๋ฑ์Šค ์Šค์บ” ๋ฒ”์œ„๋ฅผ ์ค„์ด๊ณ  ํ…Œ์ด๋ธ” ์•ก์„ธ์Šค๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋ฉฐ, ์ด๋Š” ์ธ๋ฑ์Šค ์„ค๊ณ„์™€ SQL ํŠœ๋‹์˜ ์ค‘์š”ํ•œ ์›์น™ ์ค‘ ํ•˜๋‚˜๋‹ค.

 

๐Ÿ–‡๏ธ Index Full Scan

์ธ๋ฑ์Šค ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆ˜ํ‰์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๋•Œ ์ฐจ์„ ์ฑ…์œผ๋กœ ์„ ํƒ

 

Index Full Scan

 

์ธ๋ฑ์Šค ๋ฃจํŠธ ๋ธ”๋ก๊ณผ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์„ ํ†ตํ•œ ์ˆ˜์ง์  ํƒ์ƒ‰ ์—†์ด ๋ฆฌํ”„ ๋ธ”๋ก ์ „์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆ˜ํ‰์ ์œผ๋กœ ์Šค์บ”ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์™„์ „ํžˆ ์ˆ˜์ง์  ํƒ์ƒ‰ ์—†์ด ์ง„ํ–‰๋œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

 

์‹ค์ œ๋กœ๋Š” ๋ฃจํŠธ ๋ธ”๋ก๊ณผ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ์•„๊ฐˆ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ง์  ํƒ์ƒ‰์€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฃจํŠธ ๋ธ”๋ก๊ณผ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์„ ํ†ตํ•ด ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ๋Š” ๊ณผ์ •์ด ์„ ํ–‰๋œ ํ›„์— ์ˆ˜ํ‰์  ํƒ์ƒ‰์ด ์ง„ํ–‰๋œ๋‹ค.

 

โœ”๏ธ Index Full Scan์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

 

์•„๋ž˜ ์ฟผ๋ฆฌ์—์„œ๋Š” Index Full Scan์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋Š” ์ธ๋ฑ์Šค ์„ ๋‘ ์ปฌ๋Ÿผ(STATUS)์ด WHERE ์ ˆ์— ํฌํ•จ๋˜์ง€ ์•Š์•„ Index Range Scan์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํ›„์ˆœ์œ„ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ(CUSTOMER_ID)์ด ์กฐ๊ฑด์ ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Index Full Scan 2

 

์ฆ‰, Index Range Scan์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ Table Full Scan๋ณด๋‹ค Index Full Scan์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(1) Index Full Scan์˜ ํšจ์šฉ์„ฑ

์ธ๋ฑ์Šค ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์— ์—†์œผ๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋จผ์ € Table Full Scan์„ ๊ณ ๋ คํ•˜์ง€๋งŒ, ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์ฝ๋Š” ๋ถ€๋‹ด์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค ํ™œ์šฉ์ด ๋‹ค์‹œ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋ฉด์ ์ด ํ…Œ์ด๋ธ”๋ณด๋‹ค ํ›จ์”ฌ ์ž‘๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ณต๊ฐ„์€ ์ปฌ๋Ÿผ ๊ธธ์ด × ๋ ˆ์ฝ”๋“œ ์ˆ˜ ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ, ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ž‘์€ ํฌ๊ธฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด I/O ํšจ์œจ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์ธ๋ฑ์Šค ์Šค์บ” ๋‹จ๊ณ„์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ผ๋ถ€๋งŒ ํ…Œ์ด๋ธ” ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด
์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” Table Full Scan ๋Œ€์‹  Index Full Scan์„ ์„ ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

(2) Index Full Scan์„ ํ™œ์šฉํ•œ ์ •๋ ฌ ์—ฐ์‚ฐ ์ƒ๋žต

โ‘  ์ •๋ ฌ(ORDER BY) ์—ฐ์‚ฐ ์ตœ์ ํ™”

 

Index Full Scan์€ Index Range Scan๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค๋ฅผ ์Šค์บ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ORDER BY๋ฅผ ํฌํ•จํ•œ ์ฟผ๋ฆฌ์—์„œ ๋ณ„๋„์˜ ์ •๋ ฌ ์—ฐ์‚ฐ(SORT)์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •๋ ฌ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ๋„ Index Full Scan์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ก FIRST_ROWS ํžŒํŠธ

 

Index Full Scan์€ ํŠน์ • ์ƒํ™ฉ์—์„œ Table Full Scan๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ, ์ธ๋ฑ์Šค ์Šค์บ” ๋‹จ๊ณ„์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์—†๊ณ , ๊ฑฐ์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ…Œ์ด๋ธ” ์•ก์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Index Full Scan๋ณด๋‹ค Table Full Scan์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. (Index Range Scan๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)

 

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” FIRST_ROWS ํžŒํŠธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ธ๋ฑ์Šค ์Šค์บ” ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •๋ ฌ ์—ฐ์‚ฐ์„ ์ƒ๋žตํ•˜์—ฌ ์ „์ฒด ์ง‘ํ•ฉ ์ค‘ ์ฒ˜์Œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถœ๋ ฅํ•˜๋ ค๋Š” ๋ชฉ์  ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์—์„œ ๊ทน์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ๋‹ค์ค€๋‹ค.

 

์ฃผ์˜ํ•  ์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์˜๋„ํ•œ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ ํ™œ์šฉ๊ณผ ๋‹ฌ๋ฆฌ fetch๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, Table Full Scan๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ I/O๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
์ด ๊ฒฝ์šฐ, ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์•„๋‹ˆ๋ผ, FIRST_ROWS ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ๋‹ค.

 

๐Ÿ–‡๏ธ Index Unique Scan

์ˆ˜์ง์  ํƒ์ƒ‰๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ์Šค์บ” ๋ฐฉ์‹

 

Index Unique Scan

 

Index Unique Scan์€ Unique ์ธ๋ฑ์Šค๋ฅผ '=' ์กฐ๊ฑด์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•˜๋Š” ์Šค์บ” ๋ฐฉ์‹์ด๋‹ค.


Unique ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ์€ ์ค‘๋ณต๊ฐ’์ด ์ž…๋ ฅ๋˜์ง€ ์•Š๋„๋ก DBMS๊ฐ€ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ์ธ๋ฑ์Šค ํ‚ค ์ปฌ๋Ÿผ์„ ๋ชจ๋‘ '='์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‹จ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ฐพ์œผ๋ฉด ๋˜๋ฉฐ, ์ดํ›„ ์ถ”๊ฐ€์ ์ธ ํƒ์ƒ‰์ด ํ•„์š” ์—†๋‹ค.

 

์ฆ‰, Index Unique Scan์€ '์ˆ˜์ง์  ํƒ์ƒ‰'๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๐Ÿ–‡๏ธ Index Skip Scan

(1) Index Skip Scan ์ด๋ž€

์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค์˜ ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” Table Full Scan์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํ˜น์€, I/O๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Index Full Scan์„ ์„ ํƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, Oracle 9i ๋ฒ„์ „๋ถ€ํ„ฐ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ๋น ์ง„ ๊ฒฝ์šฐ์—๋„ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์ž…๋œ ๋ฐฉ์‹์ด Index Skip Scan์ด๋‹ค.
์ด ๋ฐฉ์‹์€ ์„ ๋‘ ์ปฌ๋Ÿผ์˜ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ์ ๊ณ , ํ›„ํ–‰ ์ปฌ๋Ÿผ์˜ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ํšจ๊ณผ์ ์ด๋‹ค.

 

Index Skip Scan์œผ๋กœ ์œ ๋„ํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ํ•  ๋•Œ, index_ss, no_index_ss ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

(2) Index Skip Scan ๋™์ž‘ ์›๋ฆฌ

Index Skip Scan์€ ๋ฃจํŠธ ๋ธ”๋ก์ด๋‚˜ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์—์„œ ์ฝ์€ ์ปฌ๋Ÿผ ๊ฐ’ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ์กฐ๊ฑด์ ˆ์— ๋ถ€ํ•ฉํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฆฌํ”„ ๋ธ”๋ก๋งŒ ์„ ํƒํ•˜์—ฌ ์•ก์„ธ์Šค ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ฆ‰, ๋ถˆํ•„์š”ํ•œ ๋ธ”๋ก์€ ๊ฑด๋„ˆ๋›ฐ๊ณ (Skip) ํ•„์š”ํ•œ ๋ธ”๋ก๋งŒ ์•ก์„ธ์Šค ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฆฌํ”„ ๋ธ”๋ก๊ณผ ๋งˆ์ง€๋ง‰ ๋ฆฌํ”„ ๋ธ”๋ก์€ ํ•ญ์ƒ ๋ฐฉ๋ฌธํ•˜๋ฉฐ, ๊ทธ ์ค‘๊ฐ„์—์„œ๋Š” ํ•„์š”ํ•œ ๋ธ”๋ก๋งŒ ๊ณจ๋ผ์„œ ํƒ์ƒ‰ํ•œ๋‹ค.

 

Index Skip Scan

 

Index Skip Scan์€ Index Range Scan์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•œ ์ƒํ™ฉ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด ๋ฐฉ์‹์ด ํ•ญ์ƒ ์ตœ์„ ์ฑ…์€ ์•„๋‹ˆ๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค๋Š” Index Range Scan์„ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

์ฆ‰, ์ž์ฃผ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” SQL์„ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ผ ๋•Œ, ์ฐจ์„ ์ฑ…์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ์ „๋žต์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

(3) ๋ฒ„ํผ Pinning์„ ์ด์šฉํ•œ Skip ์›๋ฆฌ

Index Skip Scan์€ ๋ฆฌํ”„ ๋ธ”๋ก์—์„œ ๋‹ค์Œ์— ๋ฐฉ๋ฌธํ•  ๋ธ”๋ก์„ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์œ„ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์„ ์žฌ๋ฐฉ๋ฌธํ•˜์—ฌ ๋‹ค์Œ ๋ฐฉ๋ฌธํ•  ๋ฆฌํ”„ ๋ธ”๋ก์˜ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, Oracle์˜ ์ธ๋ฑ์Šค ๊ตฌ์กฐ์ƒ ๋ฆฌํ”„ ๋ธ”๋ก์—๋Š” ์ƒ์œ„ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก(ํ˜น์€ ๋ฃจํŠธ ๋ธ”๋ก)์˜ ์ฃผ์†Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํผ Pinning(Buffer Pinning) ๊ธฐ๋ฒ•์ด ํ™œ์šฉ๋œ๋‹ค.

 

โ—๋ฒ„ํผ Pinning

ํŠน์ • ๋ธ”๋ก์„ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€(Pin)ํ•œ ์ƒํƒœ์—์„œ ํ•„์š”ํ•œ ๋ฆฌํ”„ ๋ธ”๋ก์„ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ๋ฐฉ์‹

 

๋ธŒ๋žœ์น˜ ๋ธ”๋ก์„ Pinning ํ•œ ์ƒํƒœ์—์„œ ๋ฆฌํ”„ ๋ธ”๋ก์„ ํƒ์ƒ‰ํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์œผ๋กœ ๋˜๋Œ์•„์™€ ๋‹ค์Œ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.


์ด ๊ณผ์ •์—์„œ ๋ฃจํŠธ ๋˜๋Š” ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์„ ์žฌ๋ฐฉ๋ฌธํ•˜๋”๋ผ๋„, Pinning ์ƒํƒœ์ด๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ๋ธ”๋ก I/O๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

(4) ์ž‘๋™ ์กฐ๊ฑด

Index Skip Scan์€ ์„ ๋‘ ์ปฌ๋Ÿผ์˜ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ์ ๊ณ , ํ›„ํ–‰ ์ปฌ๋Ÿผ์˜ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋“œ์‹œ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ๋น ์ ธ์•ผ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๋ฑ์Šค ๊ตฌ์„ฑ์ด STATE - CUSTOMER_ID - ORDER_DATE๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

โ‘  ์ธ๋ฑ์Šค ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์—์„œ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ๋ฒ”์œ„๊ฒ€์ƒ‰ ์กฐ๊ฑด์ธ ๊ฒฝ์šฐ

 

Index Skip Scan์€ WHERE ์กฐ๊ฑด์—์„œ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์™ธ์—๋„ ๋ฒ”์œ„ ๊ฒ€์ƒ‰(BETWEEN, LIKE)์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Index Skip Scan ์˜ˆ์‹œ 2

 

์œ„์˜ ์ฟผ๋ฆฌ์—์„œ ์ผ๋ฐ˜์ ์ธ Index Range Scan์„ ์‚ฌ์šฉํ•˜๋ฉด STATUS๊ฐ€ 'P%'๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ์ธ๋ฑ์Šค ๊ตฌ๊ฐ„์„ ์ „๋ถ€ ์Šค์บ”ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ Index Skip Scan์„ ์‚ฌ์šฉํ•˜๋ฉด, STATUS๊ฐ€ 'P%'๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ธ๋ฑ์Šค ๊ตฌ๊ฐ„์—์„œ CUSTOMER_ID = '2'๋ฅผ ํฌํ•จํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฆฌํ”„ ๋ธ”๋ก๋งŒ ๊ณจ๋ผ์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ, ์„ ๋‘ ์ปฌ๋Ÿผ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ๋ง๊ณ ๋„ ๋ฒ”์œ„ ๊ฒ€์ƒ‰(LIKE, BETWEEN, <, >)์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ Index Skip Scan์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ก ์ค‘๊ฐ„ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ

 

์ธ๋ฑ์Šค ์„ ๋‘ ์ปฌ๋Ÿผ์ด ์—†์„ ๋•Œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์— ์„ ๋‘ ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์ ˆ์— ํฌํ•จ๋˜์—ˆ์ง€๋งŒ, **์ค‘๊ฐ„ ์ปฌ๋Ÿผ์ด ๋น ์ง„ ๊ฒฝ์šฐ์—๋„ Index Skip Scan์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Index Skip Scan ์˜ˆ์‹œ 1

 

โ‘ข Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ

 

Index Skip Scan์€ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ธ๋ฑ์Šค์˜ ์—ฌ๋Ÿฌ ๊ฐœ ์„ ๋‘ ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์ ˆ์— ํฌํ•จ๋˜์ง€ ์•Š๋”๋ผ๋„ Index Skip Scan์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ–‡๏ธ Index Fast Full Scan

(1) Index Fast Full Scan ์ด๋ž€?

Index Fast Full Scan์€ ์ธ๋ฑ์Šค์˜ ๋…ผ๋ฆฌ์  ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , ์ธ๋ฑ์Šค ์„ธ๊ทธ๋จผํŠธ ์ „์ฒด๋ฅผ Multiblock I/O ๋ฐฉ์‹์œผ๋กœ ์Šค์บ”ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฐฉ์‹์ด๋‹ค. ์ด๋Š” Index Full Scan๋ณด๋‹ค ๋น ๋ฅด๋ฉฐ, ํŠน์ • ์ƒํ™ฉ์—์„œ Table Full Scan์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Index Full Scan์€ ์ธ๋ฑ์Šค์˜ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ ๋ฃจํŠธ ๋ธ”๋ก → ๋ธŒ๋žœ์น˜ ๋ธ”๋ก → ๋ฆฌํ”„ ๋ธ”๋ก ์ˆœ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

 

๋ฐ˜๋ฉด, Index Fast Full Scan์€ ๋…ผ๋ฆฌ์  ์ธ๋ฑ์Šค ๊ตฌ์กฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฌผ๋ฆฌ์  ์ˆœ์„œ๋Œ€๋กœ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฝ๋Š” ๋ฐฉ์‹์ด๋‹ค.
์ด ๊ณผ์ •์—์„œ Multiblock I/O ๊ธฐ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ธ”๋ก์„ ์ฝ์–ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•œ๋‹ค. Multiblock I/O ํฌ๊ธฐ๋Š” db_file_multiblock_read_count ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

 

(2) Index Fast Full Scan์˜ ํŠน์ง•

  • Hint : index_ffs, no_index_ffs
  • Multiblock I/O ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋Ÿ‰์˜ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ์ฝ๋Š”๋‹ค.
  • ์†๋„๋Š” ๋น ๋ฅด์ง€๋งŒ, ์ธ๋ฑ์Šค ํ‚ค ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Index Full Scan ๋˜๋Š” Index Range Scan๊ณผ ๋‹ฌ๋ฆฌ, ์ธ๋ฑ์Šค๊ฐ€ ํŒŒํ‹ฐ์…˜ ๋ผ ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ ์‹œ์—๋Š” Direct Path I/O ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— I/O ์†๋„๊ฐ€ ๋” ๋นจ๋ผ์ง„๋‹ค.

โœ”๏ธ Index Full Scan vs. Index Fast Full Scan

Index Full Scan Index Fast Full Scan
์ธ๋ฑ์Šค ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ Scan ์ธ๋ฑ์Šค ์„ธ๊ทธ๋จผํŠธ ์ „์ฒด๋ฅผ Scan
๊ฒฐ๊ณผ ์ง‘ํ•ฉ ์ •๋ ฌ โญ• ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ์ •๋ ฌ โŒ
Single Block I/O Multiblock I/O
๋ณ‘๋ ฌ Scan ๋ถˆ๊ฐ€ (ํŒŒํ‹ฐ์…˜๋„ ๋ถˆ๊ฐ€) ๋ณ‘๋ ฌ Scan ๊ฐ€๋Šฅ
์„ ๋‘ ์ปฌ๋Ÿผ ์กฐ๊ฑด๋งŒ ํฌํ•จ๋˜๋ฉด OK ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ์œผ๋กœ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ

(3) Index Fast Full Scan์„ ํ™œ์šฉํ•œ ํŠœ๋‹ ์‚ฌ๋ก€

๋ณดํ†ต LIKE '%์—…์ฒด๋ช…%' ๊ฐ™์€ Index Range Scan์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฟผ๋ฆฌ๋Š” Table Full Scan์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์†๋„๊ฐ€ ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฒฐ๊ณผ ๊ฑด์ˆ˜๊ฐ€ ์ ๊ณ , ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Index Fast Full Scan์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ž์ฃผ ์กฐํšŒ๋˜์ง€ ์•Š์•„, ๋””์Šคํฌ I/O๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ์—๋„ ํšจ๊ณผ์ ์ด๋‹ค.

 

Index Fast Full Scan์˜ ํŠน์ง•์„ ์ดํ•ดํ•˜๋ฉด, ํ…Œ์ด๋ธ”์˜ BCHR(๋ฒ„ํผ ์บ์‹œ ํžˆํŠธ์œจ)๊ฐ€ ๋‚ฎ์•„ ๋””์Šคํฌ I/O๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ์œ ๋ฆฌํ•˜๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, Index Fast Full Scan์€ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ์œผ๋กœ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ๋‹ค. ์ฆ‰, ์ฟผ๋ฆฌ๊ฐ€ ํ…Œ์ด๋ธ”์˜ ์ถ”๊ฐ€ ์ปฌ๋Ÿผ์„ ํ•„์š”๋กœ ํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ Index Fast Full Scan์„ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

SELCT /*+ ORDERED USE_NL(B) NO_MERGE ROWID(B)*/ B.*
FROM (
    SELECT /*+INDEX_FFS(IDX_X)*/ ROWID RID
    FROM TABLE
    WHERE INSTR(์—…์ฒด๋ช…, '์—…์ฒด๋ช…') > 0
) A, TABLE B
WHERE B.ROWID = A.ROWID
  1. IDX_X ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ Fast Full Scan์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • LIKE ์—ฐ์‚ฐ๋ณด๋‹ค ๋น ๋ฅธ INSTR ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ธ๋‹ค.
  2. ์ฐพ์€ ROWID๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์„ ๋‹ค์‹œ ์•ก์„ธ์Šค ํ•œ๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ๋ธ”๋ก I/O๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋Š” Index Fast Full Scan ์„ ํ†ตํ•ด ์Šค์บ”ํ•ด์•ผ ํ•  ๊ฑด์ˆ˜๊ฐ€ ๋งŽ๋”๋ผ๋„ ์กฐ๊ฑด์ ˆ์— ์˜ํ•ด ํ•„ํ„ฐ๋ง๋˜๊ณ  ๋‚˜์„œ์˜ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฑด์ˆ˜๋Š” ์ ๋‹ค๋Š”๋ฐ์„œ ์ฐฉ์•ˆํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ ๊ฑด์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด, ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ Random Access๊ฐ€ ๋งŽ์•„์ ธ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์˜คํžˆ๋ ค ํšจ์œจ์ ์ผ ์ˆ˜ ๋‹ค. (11g ์ด์ƒ์ด๋ผ๋ฉด, ๊ฒฐ๊ณผ ๊ฑด์ˆ˜๊ฐ€ ๋งŽ๋”๋ผ๋„ ์ธ๋ผ์ธ๋ทฐ์— ORDER BY ROWID๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ๋”์šฑ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

๐Ÿ–‡๏ธ Index Range Scan Descending

Index Range Scan Descending์€ ๊ธฐ๋ณธ์ ์ธ Index Range Scan๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ๋’ค์—์„œ๋ถ€ํ„ฐ ์•ž์ชฝ์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ(DESC) ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐฉ์‹์ด๋‹ค. ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜์ง€๋งŒ, ํ•„์š”ํ•  ๊ฒฝ์šฐ index_desc ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.