๐Ÿง์ฟผ๋ฆฌ ์‹คํ–‰๊ณ„ํš(EXPLAIN) ์ฝ๋Š” ๋ฒ• ๊ฐ€์ด๋“œ

๊ณ„ํš์— ์ ํžŒ ์ถ”์ • ํ–‰ ์ˆ˜์™€ ์‹ค์ œ ํ–‰ ์ˆ˜์˜ ๊ดด๋ฆฌ ๋ฐฐ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ฐ ํ•ญ๋ชฉ์ด ๋ฌด์—‡์„ ๋œปํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Seq Scan ์€ ํ…Œ์ด๋ธ”์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ฌ ํ–‰์ด ํ…Œ์ด๋ธ”์˜ ํฐ ๋น„์ค‘์„ ์ฐจ์ง€ํ•  ๋•Œ๋Š” ์ด ๋ฐฉ์‹์ด ์˜คํžˆ๋ ค ๋น ๋ฅด๋ฏ€๋กœ, ๋‚˜์™”๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ ์€ ํ–‰๋งŒ ์ฐพ๋Š”๋ฐ ํฐ ํ…Œ์ด๋ธ”์—์„œ ์ด ๋…ธ๋“œ๊ฐ€ ๋ณด์ด๋ฉด ์กฐ๊ฑด์— ๋งž๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์“ฐ์ด์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DB ๋งˆ๋‹ค ๊ณ„ํš์„ ๋ณด๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค

DB๋ช…๋ น์ถœ๋ ฅ ๋ชจ์–‘
PostgreSQLEXPLAIN ยท EXPLAIN ANALYZE๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ์ค‘์ฒฉ์„ ๋ณด์—ฌ ์ฃผ๋Š” ๋…ธ๋“œ ํŠธ๋ฆฌ
MySQL ยท MariaDBEXPLAIN ยท EXPLAIN ANALYZE์ ‘๊ทผ ๋ฐฉ์‹์„ ์š”์•ฝํ•œ ํ‘œ, ๋˜๋Š” ํŠธ๋ฆฌ ํ˜•ํƒœ
SQLiteEXPLAIN QUERY PLAN์Šค์บ”๊ณผ ๊ฒ€์ƒ‰์„ ํ•œ ์ค„์”ฉ ์ ์€ ๊ฐ„๋‹จํ•œ ๋ชฉ๋ก

๊ฐ™์€ DB ๋ผ๋„ ๋ฒ„์ „์— ๋”ฐ๋ผ ํ•ญ๋ชฉ ์ด๋ฆ„๊ณผ ํ‘œ์‹œ ๋ฐฉ์‹์ด ๋ฐ”๋€๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ๋ถ™์—ฌ๋„ฃ์€ ๊ณ„ํš์„ ํ•ด์„ํ•ด ์ฃผ์ง€ ์•Š๊ณ , ๊ณ„ํš์—์„œ ์ง์ ‘ ์ฝ์–ด ์ ์€ ์ˆซ์ž๋กœ ๊ดด๋ฆฌ ๋ฐฐ์ˆ˜๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ผ๊ณ  ๊ถŒํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ๋œ ๋„๊ตฌ

๋„๊ตฌ ์„ค๋ช…

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

PostgreSQL ์˜ ANALYZE ์ถœ๋ ฅ์€ ์ถ”์ • ํ–‰ ์ˆ˜์™€ ์‹ค์ œ ํ–‰ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋ฃจํ”„ ํ•œ ๋ฒˆ๋‹น ๊ฐ’์œผ๋กœ ์ ์Šต๋‹ˆ๋‹ค. ๋ฃจํ”„ ์ˆ˜๋ฅผ ํ•จ๊ป˜ ๋„ฃ์œผ๋ฉด ๋‘ ๊ฐ’์— ๋˜‘๊ฐ™์ด ๊ณฑํ•ด ์ „์ฒด ํ•ฉ๊ณ„๋กœ ๋ณด์—ฌ ์ฃผ๋ฏ€๋กœ, ๊ดด๋ฆฌ ๋ฐฐ์ˆ˜๋Š” ๋ฃจํ”„ ํ•œ ๋ฒˆ ๊ธฐ์ค€๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ดด๋ฆฌ ๋ฐฐ์ˆ˜๋ฅผ ์–ผ๋งˆ๋ถ€ํ„ฐ ๋ฌธ์ œ๋กœ ๋ณผ์ง€๋Š” ๊ณต์ธ๋œ ๊ธฐ์ค€์ด ์—†์œผ๋ฏ€๋กœ ์ˆ˜์น˜๋ฅผ ์ž„์˜๋กœ ์ œ์‹œํ•˜์ง€ ์•Š๊ณ , ์“ฐ๊ณ  ์žˆ๋Š” ๊ธฐ์ค€์„ ๋„ฃ์œผ๋ฉด ๊ทธ ๋ฐฐ์ˆ˜๋ฅผ ๋„˜์€ ๋…ธ๋“œ๋ฅผ ์„ธ์–ด ์ค๋‹ˆ๋‹ค. ๊ณ„ํš์— ๋‚˜์˜ค๋Š” ํ•ญ๋ชฉ์€ 2026๋…„ 10์›” ๊ธฐ์ค€ PostgreSQL ํ‘œ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋œป๋งŒ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋„๊ตฌ๋Š” ๋ถ™์—ฌ๋„ฃ์€ ๊ณ„ํš์„ ํ•ด์„ํ•ด ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ„ํš ํ˜•์‹์€ DB ์™€ ๋ฒ„์ „๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ  ํ•ญ๋ชฉ ์ด๋ฆ„๋„ ๋ฐ”๋€Œ๋ฏ€๋กœ, ๊ณ„ํš์—์„œ ์ง์ ‘ ์ฝ์–ด ์ ์€ ์ˆซ์ž๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ผ๊ณ  ๊ถŒํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ๊ณ ์ณ ์ฃผ์ง€๋„ ์•Š๊ณ , ์‹คํ–‰ ์‹œ๊ฐ„์„ ์˜ˆ์ธกํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

์ถ”์ •๊ณผ ์‹ค์ œ์˜ ๊ดด๋ฆฌ๊ฐ€ ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”?

ํ”Œ๋ž˜๋„ˆ๋Š” ์ถ”์ • ํ–‰ ์ˆ˜๋ฅผ ๋ณด๊ณ  ์Šค์บ” ๋ฐฉ์‹๊ณผ ์กฐ์ธ ๋ฐฉ์‹์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ์ถ”์ •์ด 1ํ–‰์ธ๋ฐ ์‹ค์ œ๋กœ ์ˆ˜๋งŒ ํ–‰์ด ๋‚˜์˜ค๋ฉด Nested Loop ๋กœ ๊ณ ๋ฅธ ๊ณ„ํš์ด ์•ˆ์ชฝ์„ ์ˆ˜๋งŒ ๋ฒˆ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ดด๋ฆฌ๊ฐ€ ํฐ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ์ฐพ๋Š” ๊ฒƒ์ด ์ˆœ์„œ์ž…๋‹ˆ๋‹ค.

cost ์ˆซ์ž๋ฅผ ๋ฐ€๋ฆฌ์ดˆ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‚˜์š”?

๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. cost ๋Š” ํ”Œ๋ž˜๋„ˆ๊ฐ€ ๊ณ„ํš๋ผ๋ฆฌ ๋น„๊ตํ•˜๋ ค๊ณ  ์“ฐ๋Š” ์ž์ฒด ๋‹จ์œ„๋ผ์„œ ์‹œ๊ฐ„๊ณผ 1:1 ๋กœ ๋Œ€์‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์€ ANALYZE ๋ฅผ ๋ถ™์—ฌ ์‹คํ–‰ํ•œ ๋’ค actual time ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.

์ด ๋„๊ตฌ๊ฐ€ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋ถ™์—ฌ๋„ฃ์€ ์‹คํ–‰๊ณ„ํš์„ ํ•ด์„ํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”์ฒœํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ๊ณ ์ณ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์ฝ์–ด ์ ์€ ํ–‰ ์ˆ˜๋กœ ๊ดด๋ฆฌ ๋ฐฐ์ˆ˜๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.