PostgreSQL 15 ๋ฆด๋ฆฌ์Šค

15๋…„๊ฐ„์˜ ๊ฐœ๋ฐœ ๋์— PostgreSQL 2027 DBMS์˜ ์ƒˆ๋กœ์šด stable ๋ธŒ๋žœ์น˜๊ฐ€ ๊ณต๊ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋Š” XNUMX๋…„ XNUMX์›”๊นŒ์ง€ XNUMX๋…„์— ๊ฑธ์ณ ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํ˜์‹ :

  • "INSERT ... ON CONFLICT" ํ‘œํ˜„์‹๊ณผ ์œ ์‚ฌํ•œ SQL ๋ช…๋ น "MERGE"์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. MERGE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด INSERT, UPDATE ๋ฐ DELETE ์ž‘์—…์„ ๋‹จ์ผ ํ‘œํ˜„์‹์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ์กฐ๊ฑด๋ถ€ SQL ๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด MERGE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ˆ„๋ฝ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋‘ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MERGE INTO customer_account ca USING Recent_transactions t ON t.customer_id = ca.customer_id ์ผ์น˜ ํ›„ ์—…๋ฐ์ดํŠธ SET ์ž”์•ก = ์ž”์•ก + transaction_value ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฝ์ž…(customer_id, ์ž”์•ก) VALUES(t.customer_id, t.transaction_value);
  • ๋ฉ”๋ชจ๋ฆฌ์™€ ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ •๋ ฌ ์†๋„๊ฐ€ 25%์—์„œ 400%๋กœ ์ฆ๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.
  • row_number(),rank(),density_rank(),count()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œˆ๋„์šฐ ํ•จ์ˆ˜์˜ ์†๋„๊ฐ€ ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.
  • "SELECT DISTINCT" ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๋ž˜ํผ(postgres_fdw)๋Š” ์™ธ๋ถ€ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ ์™ธ์—๋„ ๋น„๋™๊ธฐ ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • LZ4 ๋ฐ Zstandard(zstd) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์›Œํฌ๋กœ๋“œ์—์„œ ๋™์‹œ์— ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” WAL ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ๋ฅผ ์••์ถ•ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฅ์•  ํ›„ ๋ณต๊ตฌ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด WAL ๋กœ๊ทธ์— ๋‚˜ํƒ€๋‚˜๋Š” ํŽ˜์ด์ง€์˜ ์‚ฌ์ „ ๊ฒ€์ƒ‰ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • pg_basebackup ์œ ํ‹ธ๋ฆฌํ‹ฐ์—๋Š” gzip, LZ4 ๋˜๋Š” zstd ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—… ํŒŒ์ผ์˜ ์„œ๋ฒ„์ธก ์••์ถ•์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‰˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ํ•„์š” ์—†์ด ์•„์นด์ด๋ธŒ๋ฅผ ์œ„ํ•ด ์ž์ฒด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜(regexp_count(), regexp_instr(), regexp_like() ๋ฐ regexp_substr()))๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์ค‘ ๋ฒ”์œ„ ์œ ํ˜•("๋‹ค์ค‘ ๋ฒ”์œ„")์„ ์ง‘๊ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ์ด range_agg() ํ•จ์ˆ˜์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ทฐ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹Œ ํ˜ธ์ถœ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋˜๋Š” ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” security_invoker ๋ชจ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋…ผ๋ฆฌ์  ๋ณต์ œ์˜ ๊ฒฝ์šฐ ํ–‰ ํ•„ํ„ฐ๋ง ๋ฐ ์—ด ๋ชฉ๋ก ์ง€์ • ์ง€์›์ด ๊ตฌํ˜„๋˜์–ด ๋ณด๋‚ธ ์‚ฌ๋žŒ ์ธก์—์„œ ๋ณต์ œ๋ฅผ ์œ„ํ•ด ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ ๋ฒ„์ „์€ ์ถฉ๋Œ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ œ ์ถฉ๋Œํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ๊ตฌ๋…์„ ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์  ๋ณต์ œ๋ฅผ ํ†ตํ•ด 2PC(XNUMX๋‹จ๊ณ„ ์ปค๋ฐ‹)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JSON ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐํ™”๋œ ํ˜•์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด ๋กœ๊ทธ ํ˜•์‹์ธ jsonlog๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ์ž๋Š” ํŠน์ • PostgreSQL ์„œ๋ฒ„ ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ณ„ ๊ถŒํ•œ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • psql ์œ ํ‹ธ๋ฆฌํ‹ฐ์—๋Š” "\dconfig" ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •(pg_settings)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์šด์˜์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์ถ•์ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋””์Šคํฌ์— ์žฌ์„ค์ •ํ•˜๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ICU ๋กœ์ผ€์ผ "ICU Collation"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” libc ๋กœ์ผ€์ผ๋งŒ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WAL ๋กœ๊ทธ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์žฅ ํ™•์žฅ pg_walinspect๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต์šฉ ์Šคํ‚ค๋งˆ์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ์œ ์ž๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ CREATE ๋ช…๋ น ์‹คํ–‰ ๊ถŒํ•œ์ด ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Python 2์— ๋Œ€ํ•œ ์ง€์›์ด PL/Python์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋…์  ๋ฐฑ์—… ๋ชจ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€: 19:00๋ถ€ํ„ฐ 20:00(MSK)๊นŒ์ง€ Pavel Luzanov(Postgres Professional)์™€ ํ•จ๊ป˜ ์ƒˆ ๋ฒ„์ „์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜๋Š” ์›น ์„ธ๋ฏธ๋‚˜๊ฐ€ ์žˆ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋ฐฉ์†ก์— ์ฐธ์—ฌํ•˜์ง€ ๋ชปํ•˜์‹  ๋ถ„๋“ค์„ ์œ„ํ•ด PGConf.Russia์—์„œ ์ง„ํ–‰๋œ Pavel์˜ 15์›” ๋ณด๊ณ ์„œ "PostgreSQL XNUMX: MERGE and more" ๋…นํ™”๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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