๊ฒŒ์œผ๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ: PostgreSQL 12๊ฐ€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๊ฒŒ์œผ๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ: PostgreSQL 12๊ฐ€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

PostgreSQL 12"์„ธ๊ณ„ ์ตœ๊ณ ์˜ ์˜คํ”ˆ ์†Œ์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค"์˜ ์ตœ์‹  ๋ฒ„์ „์ธ ๊ฐ€ ๋ช‡ ์ฃผ ์•ˆ์— ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค(๋ชจ๋“  ๊ฒƒ์ด ๊ณ„ํš๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค๋ฉด). ์ด๋Š” XNUMX๋…„์— ํ•œ ๋ฒˆ์”ฉ ์ˆ˜๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ์ƒˆ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ผ์ •์„ ๋”ฐ๋ฅด๋ฉฐ, ์†”์งํžˆ ์ด๋Š” ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ PostgreSQL ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํ™œ๋™์ ์ธ ํšŒ์›์ด ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์ด์ „ ๋ฆด๋ฆฌ์Šค์™€ ๋‹ฌ๋ฆฌ PostgreSQL 12์—๋Š” ๋ถ„ํ•  ๋˜๋Š” ์ฟผ๋ฆฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ํ•œ๋‘ ๊ฐ€์ง€ ํ˜์‹ ์ ์ธ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” PostgreSQL 12์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์ด ๋” ๋›ฐ์–ด๋‚œ ์•ˆ์ •์„ฑ์ด๋ผ๊ณ  ๋†๋‹ดํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค์˜ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€์š”?

๊ทธ๋Ÿฌ๋‚˜ PostgreSQL 12๋Š” ์—ฌ๊ธฐ์„œ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๊ณผ ๊ฐœ์„  ์‚ฌํ•ญ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

(๊ธ€์Ž„, ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์˜ˆ์ „๋งŒํผ ๋ฌด์„ญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

PostgreSQL์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์†Œ๋ž€ ์—†์ด ์ฆ‰์‹œ ์ƒ๋‹นํ•œ ๊ฐœ์„ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ์ „ ์ €๋Š” PostgreSQL 9.4์—์„œ PostgreSQL 10์œผ๋กœ์˜ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  PostgreSQL 10์˜ ํ–ฅ์ƒ๋œ ์ฟผ๋ฆฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋•๋ถ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋นจ๋ผ์กŒ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค). max_parallel_workers).

๋™์˜ํ•˜์„ธ์š”. ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฆ‰์‹œ ๋” ์ž˜ ์ž‘๋™ํ•˜๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  PostgreSQL์—๋Š” ์ ์  ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด PostgreSQL 12๋กœ ๊ฐ„๋‹จํžˆ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ง€๊ธˆ ๋ง์”€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์ธ๋ฑ์‹ฑ ๊ฐœ์„ 

์ธ๋ฑ์‹ฑ์ด ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฉ€๋ฆฌ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ณด๋ฅผ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? PostgreSQL์˜ ๊ธฐ๋ณธ ์ธ๋ฑ์‹ฑ ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. B-ํŠธ๋ฆฌ. ์ด ์œ ํ˜•์˜ ์ธ๋ฑ์Šค๋Š” ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค CREATE INDEX ON some_table (some_column), PostgreSQL์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€์†์ ์œผ๋กœ ๊ฐ’์„ ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œํ•˜๋Š” ๋™์•ˆ ์ธ๋ฑ์Šค๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์ด ์ €์ ˆ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ PostgreSQL ์ธ๋ฑ์Šค์—๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€ํ’€๋ ค์ ธ ์žˆ๋‹ค ์ถ”๊ฐ€ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ฐ ์—…๋ฐ์ดํŠธ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค. "๋ถ€ํ’€์–ด ์˜ค๋ฅธ๋‹ค"๋Š” ๊ฒƒ์€ ์ธ๋ฑ์Šค ๊ตฌ์กฐ๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๊ฑฐํ•˜๋Š” ๊ฐ€๋น„์ง€ ํŠœํ”Œ๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„๊ณต (์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ Peter Gaghan์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค)ํ”ผํ„ฐ ๊ฑฐ๊ฒŒ๊ฑด)). ์ธ๋ฑ์Šค ํŒฝ์ฐฝ์€ ์ธ๋ฑ์Šค๊ฐ€ ํ™œ๋ฐœํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์›Œํฌ๋กœ๋“œ์—์„œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.

PostgreSQL 12๋Š” B-ํŠธ๋ฆฌ ์ธ๋ฑ์Šค์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ์œผ๋ฉฐ TPC-C์™€ ๊ฐ™์€ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‚ฌ์šฉํ•œ ์‹คํ—˜์— ๋”ฐ๋ฅด๋ฉด ํ˜„์žฌ ํ‰๊ท  40% ๋” ์ ์€ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” B-ํŠธ๋ฆฌ ์ธ๋ฑ์Šค ์œ ์ง€ ๊ด€๋ฆฌ(์ฆ‰, ์“ฐ๊ธฐ ์ž‘์—…)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค๊ฐ€ ํ›จ์”ฌ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์—๋„ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์„ ์ ๊ทน์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์ผ๋ฐ˜์ ์œผ๋กœ OLTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์‹ค์‹œ๊ฐ„ ๊ฑฐ๋ž˜ ์ฒ˜๋ฆฌ) - ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์š”์ฒญ์„ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ ๊ณต๊ฐ„์ด ๋งŽ์„์ˆ˜๋ก ์ธํ”„๋ผ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ๊ณต๊ฐ„์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์—…๊ทธ๋ ˆ์ด๋“œ ์ „๋žต์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ด์ ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด B-ํŠธ๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ์žฌ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: pg_upgrade ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ์ด์ „ ๋ฒ„์ „์˜ PostgreSQL์—์„œ๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€๊ทœ๋ชจ ์ธ๋ฑ์Šค๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๋ฉด ๊ทธ ๋™์•ˆ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํ•œ ๋‹ค์šดํƒ€์ž„์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ PostgreSQL 12์—๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๋ณ‘๋ ฌ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์žฌ์ƒ‰์ธ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์™„์ „ํžˆ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL 12์˜ ์ธ๋ฑ์‹ฑ ์ธํ”„๋ผ์—๋Š” ๋‹ค๋ฅธ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์ด ์žˆ์—ˆ๋˜ ๋˜ ๋‹ค๋ฅธ ์ผ - ๋ฏธ๋ฆฌ ์“ฐ๊ธฐ ๋กœ๊ทธ, ์ผ๋ช… WAL(๋ฏธ๋ฆฌ ์“ฐ๊ธฐ ๋กœ๊ทธ)์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ์“ฐ๊ธฐ ๋กœ๊ทธ๋Š” ์‹คํŒจ ๋ฐ ๋ณต์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ PostgreSQL์˜ ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฅผ ๋ณด๊ด€ ๋ฐ ํŠน์ • ์‹œ์  ๋ณต๊ตฌ. ๋ฌผ๋ก  ๋ฏธ๋ฆฌ ์“ฐ๊ธฐ ๋กœ๊ทธ๋Š” ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL 12๋Š” ์ธ๋ฑ์Šค ์ƒ์„ฑ ์ค‘์— GiST, GIN ๋ฐ SP-GiST ์ธ๋ฑ์Šค์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” WAL ๋ ˆ์ฝ”๋“œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹ค์งˆ์ ์ธ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. WAL ๋ ˆ์ฝ”๋“œ๋Š” ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋œ ์ฐจ์ง€ํ•˜๋ฉฐ ์žฌํ•ด ๋ณต๊ตฌ๋‚˜ ํŠน์ • ์‹œ์  ๋ณต๊ตฌ ๋“ฑ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ์žฌ์ƒ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋Ÿฌํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค์–ด PostGIS ๊ธฐ๋ฐ˜ ์ง€๋ฆฌ๊ณต๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ GiST ์ธ๋ฑ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•จ) ์ด๋Š” ์‚ฌ์šฉ์ž์˜ ๋…ธ๋ ฅ ์—†์ด๋„ ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํŒŒํ‹ฐ์…”๋‹ - ๋” ํฌ๊ณ , ๋” ์ข‹๊ณ , ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

PostgreSQL 10 ๋„์ž… ์„ ์–ธ์  ํŒŒํ‹ฐ์…”๋‹. PostgreSQL 11์—์„œ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. PostgreSQL 12์—์„œ๋Š” ์„น์…˜ ๊ทœ๋ชจ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL 12์—์„œ๋Š” ํŠนํžˆ ํ…Œ์ด๋ธ”์— ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํŒŒํ‹ฐ์…”๋‹ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ช‡ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ๋งŒ ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์—์„œ INSERT ์ž‘์—…์ด ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ - ๊ทธ๋Ÿฐ๋ฐ, ์ด๊ฑฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋„ค ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค JSON ์ˆ˜์‹  โ€” PostgreSQL 12์˜ ๋ถ„ํ• ๋œ ํ…Œ์ด๋ธ”๋„ ๋”์šฑ ํšจ์œจ์ ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. COPY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฏธ ๋นจ๋ผ์กŒ์ง€๋งŒ PostgreSQL 12์—์„œ๋Š” ํ™•์‹คํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ์ •ํ™•ํžˆ "์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์ฆ๊ธฐ๋Š”" ๊ฐœ์„  ์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ PostgreSQL 12์—์„œ๋Š” ๋ถ„ํ• ๋œ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ถ„ํ•  ์ž‘์—…์ด ์ฆ๊ฑฐ์›Œ์ง‘๋‹ˆ๋‹ค.

WITH ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋” ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค.

์–ธ์ œ ๊ธฐ๋ณธ ์ œ๊ณต ๊ณตํ†ต ํ…Œ์ด๋ธ” ํ‘œํ˜„์‹์— ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์ผ๋ช… CTE, ์ผ๋ช… WITH ์ฟผ๋ฆฌ)์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์“ฐ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. PostgreSQL์„ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋Š” ์–ผ๋งˆ๋‚˜ ํ–‰๋ณตํ–ˆ๋Š”์ง€. ์ด๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  CTE๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ.

๋‚˜๋Š” ์ข…์ข… SQL ์ดˆ๋ณด์ž๋“ค์ด CTE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋Š”๋ฐ, CTE๋ฅผ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ •๋ง ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ๋Œ์•„๋‹ค๋‹ˆ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค. ะฑะตะท CTE ๋ฐ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ. ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

PostgreSQL 12๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€์ž‘์šฉ ์—†์ด ํŠน์ • ์œ ํ˜•์˜ CTE๋ฅผ ์ธ๋ผ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(SELECT), ์š”์ฒญ์ด ๋๋‚  ๋ฌด๋ ต์— ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑํ•œ CTE ์ฟผ๋ฆฌ๋ฅผ ๊ณ„์† ์ถ”์ ํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„์ด ์ด ๋ฒ”์ฃผ์— ์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ด์ œ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ PostgreSQL 12๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•  ํ•„์š” ์—†์ด SQL ์‹คํ–‰ ์ž์ฒด๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ์€ ๊ทธ๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์„์ง€๋ผ๋„ PostgreSQL์ด ๊ณ„์†ํ•ด์„œ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

JIT(Just-in-Time) - ์ด์ œ ๊ธฐ๋ณธ๊ฐ’

์ง€์›๋˜๋Š” PostgreSQL 12 ์‹œ์Šคํ…œ Llvm JIT ์ปดํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ง€์›์„ ๋ฐ›์•„๋ณด์„ธ์š”. JIT ์ผ๋ถ€ ๋‚ด๋ถ€ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ๋กœ ์„ ํƒ ๋ชฉ๋ก(SELECT ์ดํ›„์— ์žˆ์Œ)์˜ ํ‘œํ˜„์‹(๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ๋Š” x + y)์ด ํฌํ•จ๋œ ์ฟผ๋ฆฌ, ์ง‘๊ณ„, WHERE ์ ˆ์ด ํฌํ•จ๋œ ํ‘œํ˜„์‹ ๋“ฑ์€ JIT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL 12์—์„œ๋Š” JIT๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €์ ˆ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ JIT๋ฅผ ๋„์ž…ํ•œ PostgreSQL 11์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์กฐ์ •ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

PostgreSQL 12์˜ ๋‚˜๋จธ์ง€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

PostgreSQL 12์—๋Š” ํ‘œ์ค€ SQL/JSON ๊ฒฝ๋กœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค๋‹จ๊ณ„ ์ธ์ฆ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ˆ˜๋งŽ์€ ๋ฉ‹์ง„ ์ƒˆ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. clientcert=verify-full, ์ƒ์„ฑ๋œ ์—ด ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๊ฒŒ์‹œ๋ฌผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€