[PostgreSQL] Scan

Scan์ด๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•ด๋†จ๋‹ค๊ฐ€ ์ฝ์–ด๋“ค์ด๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๋Š”๋ฐ. DB ์‚ฌ์šฉ์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ํฐ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ด๊ฒƒ์ด๋‹ค.

๋””์Šคํฌ๋Š” ๊ฒ๋‚˜ ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šค์บ”์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ  DB ์‹œ์Šคํ…œ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅธ๋ฐ, ์ผ๋‹จ ์—ฌ๊ธฐ์„œ๋Š” Postgres์˜ ์Šค์บ” ์ข…๋ฅ˜๋งŒ ๊ฐ„๋žตํžˆ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Postgres์—๋Š” ํฌ๊ฒŒ ์ˆœ์ฐจ ์Šค์บ”, ์ธ๋ฑ์Šค ์Šค์บ”, ์ธ๋ฑ์Šค Only ์Šค์บ”, ๋น„ํŠธ๋งต ์Šค์บ”, TID ์Šค์บ” ๋“ฑ์ด ์žˆ๋‹ค.



์ˆœ์ฐจ ์Šค์บ”(Sequencial Scan)

์ˆœ์ฐจ ์Šค์บ”์€ ๋ง ๊ทธ๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด์˜ค๋Š” ์Šค์บ”์ด๋‹ค.

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ , ๊ธฐ๋ณธ์ ์ด์ง€๋งŒ ์„ฑ๋Šฅ์˜ ํญ๋ฐœ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
๋งŒ์•ฝ ํ…Œ์ด๋ธ”์— 10000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ , ๊ทธ ์ค‘์— 1๊ฐœ๋งŒ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•ด๋„ ์ˆœ์ฐจ ์Šค์บ”์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด 10000๊ฐœ๋ฅผ ์ „๋ถ€ ์ฝ์–ด์•ผ ํ•˜๋Š” ๋ง๋„ ์•ˆ๋˜๋Š” ์ผ์ด ๋ฒŒ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—๋‹ค.

๊ทธ๋ž˜์„œ ์ €๊ธฐ์„œ text ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ค๋ ค ํ•ด๋„

์‹คํ–‰์‹œ๊ฐ„์ด ์ „ํ˜€ ์ค„์–ด๋“ค์ง€ ์•Š์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋งŽ์•„์งˆ์ˆ˜๋ก ์ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๋Š” ์ปค์ง„๋‹ค.
์•„๋ž˜๋Š” ์•ฝ 2์ฒœ๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์—ˆ์„ ๋•Œ์˜ ์‹คํ–‰๊ณ„ํš์ด๋‹ค.

๋น„์šฉ์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ƒ์Šนํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ˆœ์ฐจ์Šค์บ”์€ ์•„์ฃผ ์ ์€ ํŠน์ • ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.



์ธ๋ฑ์Šค ์Šค์บ”(Index Scan)

์ธ๋ฑ์Šค๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ƒ‰์ธ(Index)์„ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์— ๋ฐ˜ํ•ด์„œ, ์ธ๋ฑ์Šค๋Š” BํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์›๋ณธ์„ ์ง์ ‘ ์ฐธ์กฐํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅธ ์†๋„๋กœ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ธ๋ฑ์Šค์˜ ์ƒ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช… USING btree (์ปฌ๋Ÿผ๋“ค)

๋‹ค์‹œ ์ด์ „์˜ ์ฟผ๋ฆฌ๋ฅผ ์ธก์ •ํ•ด๋ณด๋ฉด, ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

๋น„์šฉ์ด 28๋งŒ์— ๋‹ฌํ–ˆ๋˜ ๊ฒƒ์ด ๋ฌด๋ ค 11๋กœ ์ค„์–ด๋“ค์—ˆ๋‹ค.
๋ฌด์‹ํ•˜๊ฒŒ ์ฝ์–ด์˜จ๋‹ค์Œ์— ๊ฑธ๋Ÿฌ๋‚ธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ธ๋ฑ์Šค ํŠธ๋ฆฌ๋กœ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•œ ํ›„์— ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ ‡๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ปฌ๋Ÿผ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ๋‹ฌ์•„์ฃผ๋Š”๊ฒŒ ๋น ๋ฅด๊ณ  ์ข‹์€ ๊ฑธ๊นŒ?
๊ทธ๋ ‡์ง€๋Š” ์•Š๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ๋Œ€์‘๋˜๋Š” ์ธ๋ฑ์Šค ํŠธ๋ฆฌ๊ฐ’์ด ์ƒ๊ฒจ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ง€ ์•Š๊ฒŒ ์ฐจ์ง€ํ•œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œํ• ๋•Œ๋งˆ๋‹ค ์ธ๋ฑ์Šค๊ฐ’๋„ ๊ทธ์— ๋งž์ถฐ์ฃผ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ๋ถ€ํ•˜๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ์ธ๋ฑ์Šค ์Šค์บ”์ด ์ˆœ์ฐจ ์Šค์บ”๋ณด๋‹ค ํ•ญ์ƒ ๋น ๋ฅธ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.
์ธ๋ฑ์Šค ์Šค์บ”์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋žœ๋คIO๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ์ž‘์—… ์ž์ฒด๋Š” ์‚ฌ์‹ค ์ˆœ์ฐจIO๋ณด๋‹ค ๋Œ€๋žต 4๋ฐฐ๋Š” ๋А๋ฆฌ๋‹ค!
'๋น ๋ฅด๊ฒŒ ์„ ๋ณ„ํ•ด์„œ' ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์ง€, ์ฝ์–ด์˜ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋น ๋ฅธ ๊ฒƒ์€ ์•„๋‹ˆ๋ž€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ญ”๊ฐ€ ์ž”๋œฉ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋” ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ํ…Œ์ด๋ธ” ๊ทœ๋ชจ๊ฐ€ ์–ด๋А ์ž„๊ณ„์ ์„ ๋„˜์–ด์„œ ์ดˆ๋Œ€ํ˜• ๊ทœ๋ชจ๊ฐ€ ๋˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์˜คํžˆ๋ ค ๋А๋ ค์ง€๊ณ  ์ˆœ์ฐจ ์Šค์บ”์ด ๋นจ๋ผ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ์ˆœ์ฐจ์Šค์บ”์€ ๊ทœ๋ชจ๊ฐ€ ํด ๊ฒฝ์šฐ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ํ›จ์”ฌ ๋น ๋ฅธ ์Šค์บ”์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ธ๋ฑ์Šค์˜ ๋žœ๋ค ์ ‘๊ทผ์€ ํ…Œ์ด๋ธ” ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ์บ์‹ฑ ์„ฑ๊ณต ํ™•๋ฅ ์ด ๋‚ฎ์•„์ง€๋Š” ๋“ฑ์˜ ๊ฒฐ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์†Œํ˜• ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ์ˆœ์ฐจ์™€ ์ธ๋ฑ์Šค์˜ ์†์ต์ ์ด 15%๋ผ๋ฉด, ๋Œ€ํ˜•์˜ ๊ฒฝ์šฐ์—๋Š” 5%, ์ดˆ๋Œ€ํ˜•์˜ ๊ฒฝ์šฐ์—๋Š” 1%๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 1%๋ฅผ ์ธ๋ฑ์Šค ์Šค์บ”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ˆœ์ฐจ์Šค์บ”์„ ๋•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›ฌ๋งŒํ•˜๋ฉด ํ•„์š”ํ•  ๋•Œ, ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ถ”๊ฐ€ํ•ด์„œ ์“ฐ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.



์ธ๋ฑ์Šค Only ์Šค์บ”

์ด๊ฑด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค ์Šค์บ”๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
์ฐจ์ด์ ์€, ์ธ๋ฑ์Šค๋กœ ํƒ์ƒ‰ํ•ด์„œ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์•„๊นŒ๋Š” select *๋กœ ์ธ๋ฑ์Šค์ปฌ๋Ÿผ์ด ์•„๋‹Œ๊ฒƒ๊นŒ์ง€ ๋‹ค ๊ฐ€์ ธ์™”์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ์ธ๋ฑ์Šค์ธ text๋งŒ ๊ฐ€์ ธ์™”๋‹ค.

์ธ๋ฑ์Šค ์Šค์บ”์— ๋น„ํ•ด์„œ ํŠน๋ณ„ํ•œ ์„ฑ๋Šฅ ์ด์ ์ด ์žˆ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.



๋น„ํŠธ๋งต(Bitmap) ์Šค์บ”

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

๋น„ํŠธ๋งต ์Šค์บ”์€ ๋น„ํŠธ๋งต ์ธ๋ฑ์Šค ์Šค์บ”๊ณผ ๋น„ํŠธ๋งต ํž™ ์Šค์บ”์˜ 2 ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.
1.๋น„ํŠธ๋งต ์ธ๋ฑ์Šค ์Šค์บ”์ด๋ž€ ๊ฒƒ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋น„ํŠธ๋งต์ด๋ž€ ๊ฑธ ๋งŒ๋“ค๊ณ ,
2.๋น„ํŠธ๋งต ํž™ ์Šค์บ”. ๊ทธ ๋น„ํŠธ๋งต์„ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค.



TID ์Šค์บ”

postgresql์˜ ๋ฐ์ดํ„ฐ์—๋Š” TID๋ผ๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„๊ฐ’์ด ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค.
์ด๊ฑด ํ‰์†Œ์—” ์ˆจ๊ฒจ์ ธ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜ ์ปฌ๋Ÿผ์ฒ˜๋Ÿผ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ €๊ฑธ ํ†ตํ•ด ๊ฒ€์ƒ‰์„ ์‹œ๋„ํ•˜๋ฉด TID ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋งˆ ๋น ๋ฅด๊ธฐ๋Š” ์ œ์ผ ๋น ๋ฅด์ง€ ์•Š๋‚˜ ์‹ถ๋‹ค?


์ฐธ์กฐ
"ใ€Ž์ƒˆ๋กœ ์“ด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†”๋ฃจ์…˜ใ€, ์ดํ™”์‹"
https://severalnines.com/database-blog/overview-various-scan-methods-postgresql
http://www.gurubee.net/lecture/2394
http://wiki.gurubee.net/pages/viewpage.action?pageId=1507452