14๋ ๊ฐ์ ๊ฐ๋ฐ ๋์ PostgreSQL 2026 DBMS์ ์๋ก์ด stable ๋ธ๋์น๊ฐ ๊ณต๊ฐ๋์์ผ๋ฉฐ, ์๋ก์ด ๋ธ๋์น์ ๋ํ ์ ๋ฐ์ดํธ๋ XNUMX๋ XNUMX์๊น์ง XNUMX๋ ์ ๊ฑธ์ณ ์ถ์๋ ์์ ์ ๋๋ค.
์ฃผ์ ํ์ :
- ๋ฐฐ์ด๊ณผ ๊ฐ์ ํํ์์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ธฐ ์ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. SELECT ('{ "postgres": { "release": 14 }}'::jsonb)['postgres']['release']; SELECT * FROM test WHERE ์ธ๋ถ์ ๋ณด['attributes']['size'] = '"medium"';
hstore ์ ํ์์ ์ ๊ณตํ๋ ํค/๊ฐ ๋ฐ์ดํฐ์ ๋ํด ์ ์ฌํ ๊ตฌ๋ฌธ์ด ๊ตฌํ๋ฉ๋๋ค. ์ด ๊ตฌ๋ฌธ์ ์ฒ์์ ๋ฒ์ฉ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์์ผ๋ฉฐ ๋์ค์ ๋ค๋ฅธ ์ ํ์๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. hstore ์ ํ์ ์: INSERT INTO mytable VALUES ('a=>b, c=>d'); SELECT h['a'] FROM mytable; UPDATE mytable SET h['c'] = 'new';
- ๋ฒ์๋ฅผ ์ ์ํ๊ธฐ ์ํ ์ ํ ๊ณ์ด์ด ์๋ก์ด "๋ค์ค ๋ฒ์" ์ ํ์ผ๋ก ํ์ฅ๋์์ต๋๋ค. ์ด ์ ํ์ ์ฌ์ฉํ๋ฉด ๊ฒน์น์ง ์๋ ๊ฐ ๋ฒ์์ ์ ๋ ฌ๋ ๋ชฉ๋ก์ ์ง์ ํ ์ ์์ต๋๋ค. ๊ธฐ์กด์ ๊ฐ ๋ฒ์ ์ ํ ์ธ์๋ ์์ฒด ๋ค์ค ๋ฒ์ ์ ํ์ด ์ ์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด "int4range" ์ ํ์ "int4multirange"์ ํด๋นํ๊ณ "daterange" ์ ํ์ "datemultirange"์ ํด๋นํฉ๋๋ค. ์๋ก์ด ์ ํ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ฒ์ ์ํ์ค๋ฅผ ์กฐ์ํ๋ ์ฟผ๋ฆฌ ๋์์ธ์ด ๋จ์ํ๋ฉ๋๋ค. SELECT '{[3,7), [8,9)}'::int4multirange; SELECT nummultirange(์ซ์ ๋ฒ์(1.0, 14.0), ์ซ์ ๋ฒ์(20.0, 25.0));
- ๋ค์์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋ ๊ณ ๋ถํ ์์คํ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ก์ต๋๋ค. ์ผ๋ถ ํ ์คํธ์์๋ ์ฑ๋ฅ์ด 2๋ฐฐ ์ฆ๊ฐํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
- B-ํธ๋ฆฌ ์ธ๋ฑ์ค์ ํจ์จ์ฑ์ด ํฅ์๋์์ผ๋ฉฐ, ํ ์ด๋ธ์ด ์์ฃผ ์ ๋ฐ์ดํธ๋ ๋ ์ธ๋ฑ์ค๊ฐ ์ฆ๊ฐํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
- ์์ฒญ ํ์ดํ๋ผ์ธ ์ ์ก์ ํด๋ผ์ด์ธํธ ์ธก(libpq ์์ค์์ ๊ตฌํ๋จ) ๋ชจ๋์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด์ ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์์ฒญ์ ํฉ๋๋ค. ๋ํ ์ด ๋ชจ๋๋ ํจํท ์ ๋ฌ ์ง์ฐ์ด ๊ธด ์ฐ๊ฒฐ ์์ ์๋๋ฅผ ๋์ด๋ ๋ฐ๋ ๋์์ด ๋ฉ๋๋ค.
- ์ฌ๋ฌ PostgreSQL ์๋ฒ์ ๊ด๋ จ๋ ๋ถ์ฐ ๊ตฌ์ฑ์ ์ํ ํฅ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ๋ ผ๋ฆฌ์ ๋ณต์ ๊ตฌํ์์๋ ์ด์ ์งํ ์ค์ธ ํธ๋์ญ์ ์ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๋ก ๋ณด๋ด๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋ฉฐ, ์ด๋ ๋๊ท๋ชจ ํธ๋์ญ์ ์ ๋ณต์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ํ ๋ ผ๋ฆฌ์ ๋ณต์ ์ค์ ์์ ๋ ๋ฐ์ดํฐ์ ๋ ผ๋ฆฌ์ ๋์ฝ๋ฉ์ด ์ต์ ํ๋์์ต๋๋ค.
- ์ธ๋ถ ํ ์ด๋ธ ์ฐ๊ฒฐ ๋ฉ์ปค๋์ฆ ์ธ๋ถ ๋ฐ์ดํฐ ๋ํผ(postgres_fdw)์ ๋ณ๋ ฌ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ ํ์ฌ ๋ค๋ฅธ PostgreSQL ์๋ฒ์ ์ฐ๊ฒฐํ ๋๋ง ์ ์ฉํ ์ ์์ต๋๋ค. postgres_fdw๋ ๋ํ ๋ฐฐ์น ๋ชจ๋์์ ์ธ๋ถ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ๊ณผ "IMPORT FOREIGN SCHEMA" ์ง์๋ฌธ์ ์ง์ ํ์ฌ ๋ถํ ๋ ํ ์ด๋ธ์ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค.
- VACUUM ์์ (๋์คํฌ ์คํ ๋ฆฌ์ง์ ๊ฐ๋น์ง ์์ง ๋ฐ ํจํค์ง) ๊ตฌํ์ด ์ต์ ํ๋์์ต๋๋ค. ํธ๋์ญ์ ID ๋ฉ์ด๋ผ์ด๋ ์กฐ๊ฑด์ด ์์ฑ๋๋ฉด ํ์์ ์ด์ง ์์ ์ ๋ฆฌ ์์ ์ ๊ฑด๋๋ฐ๋ ๊ธด๊ธ ์ ๋ฆฌ ๋ชจ๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. B-Tree ํ์์ ์ธ๋ฑ์ค ์ฒ๋ฆฌ ์ ์ค๋ฒํค๋๊ฐ ๊ฐ์๋์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด์์ ๋ํ ํต๊ณ๋ฅผ ์์งํ๋ 'ANALYZE' ์์ ์ ์คํ ์๋๊ฐ ๋ํญ ๋นจ๋ผ์ก์ต๋๋ค.
- ํ ์คํธ ๋ธ๋ก์ด๋ ๊ธฐํํ์ ์ ๋ณด์ ๊ฐ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ TOAST ์์คํ ์์ ์ฌ์ฉ๋๋ ์์ถ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. TOAST์์๋ pglz ์์ถ ๋ฐฉ๋ฒ ์ธ์๋ LZ4 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- DBMS ์ด์์ ๋ชจ๋ํฐ๋งํ๋ ๋๊ตฌ๊ฐ ํ์ฅ๋์์ต๋๋ค. COPY ๋ช ๋ น(pg_stat_progress_copy)์ ์งํ ์ํฉ, ๋ณต์ ์ฌ๋กฏ์ ๋ํ ํต๊ณ(pg_stat_replication_slots) ๋ฐ WAL ํธ๋์ญ์ ๋ก๊ทธ์ ๊ด๋ จ๋ ํ๋(pg_stat_wal)์ ์ถ์ ํ๋ ๋ทฐ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. pg_stat_activity ๋ฐ EXPLAIN VERBOSE์ ๊ฐ์ ๋ค์ํ ํ์ ์์คํ ์ด ๊ฐ ์์ฒญ์ ๊ณ ์ ์๋ณ์๋ฅผ ํ ๋นํ์ฌ ์์ฒญ์ ์ถ์ ํ ์ ์๋๋ก ํ๋ Compute_query_id ํจ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- ์ฟผ๋ฆฌ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ณ ์์ฐจ ๋ ์ฝ๋ ์ค์บ ์์ ์ ๋์ ์คํ ์ฑ๋ฅ, "RETURN QUERY" ๋ช ๋ น์ ์ฌ์ฉํ PL/pgSQL์ ์ฟผ๋ฆฌ ๋ณ๋ ฌ ์คํ ๋ฐ "์์ ์ฟผ๋ฆฌ์ ๋ณ๋ ฌ ์คํ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ฟผ๋ฆฌ ํ๋๋์ ์ต์ ํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ๊ตฌ์ฒดํ๋ ๋ณด๊ธฐ๋ฅผ ์๋ก ๊ณ ์นฉ๋๋ค.โ ์ํ ์ค์ฒฉ ๋ณํฉ(์กฐ์ธ)์ ์ฑ๋ฅ์ ํฅ์ํ๊ธฐ ์ํด ์ถ๊ฐ ์บ์ฑ์ ๋ํ ์ง์์ด ๊ตฌํ๋์์ต๋๋ค.
- ์ด์ ๊ณ ๊ธ ํต๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ํํ์์ ์ต์ ํํ ์ ์์ผ๋ฉฐ ์ฆ๋ถ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ์ฐฝ ๊ธฐ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ฝ๋ ๋ธ๋ก์์ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ ์ ์๋ ์ ์ฅ ํ๋ก์์ ๋ ์ด์ "OUT" ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ ๋ฐ์ดํฐ ์ ์๋ฅผ ์ง์ํฉ๋๋ค.
- ์ง์ ๋ ๊ฐ๊ฒฉ์ ๋ฐ๋ผ ํ์์คํฌํ ๊ฐ์ ๋ฐ์ฌ๋ฆผํ๋ date_bin ํจ์๋ฅผ ์ถ๊ฐํ์ต๋๋ค. SELECT date_bin('15๋ถ', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01'); 2020-02-11 15:30:00
- ์ฌ๊ท ๊ณตํต ํ ์ด๋ธ ํํ์(CTE)์์ ์ฃผ๊ธฐ๋ฅผ ๋ ์ฝ๊ฒ ์ ๋ ฌํ๊ณ ์๋ณํ ์ ์๋๋ก SQL ํ์ค์ ์ ์๋ SEARCH ๋ฐ CYCLE ํํ์์ ์ถ๊ฐํ์ต๋๋ค. WITH RECURSIVE search_tree(id, link, data) AS ( SELECT t.id, t.link, t.data FROM tree t UNION ALL SELECT t.id, t.link, t.data FROM tree t, search_tree st WHERE t. id = st.link ) ๊ฒ์ ๊น์ด ์ฐ์ id SET ordercol SELECT * FROM search_tree ORDER BY ordercol;
- psql ์ ํธ๋ฆฌํฐ์์๋ ํญ์ด ์๋ ๋ช ๋ น์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ๊ฐ์ ๋์๊ณ , ํจ์ ์ธ์๋ฅผ ํ์ํ๋ ๊ธฐ๋ฅ์ด "\df" ๋ช ๋ น์ ์ถ๊ฐ๋์์ผ๋ฉฐ, ํ์๋๋ ํต๊ณ๊ฐ "\dX" ๋ช ๋ น์ผ๋ก ํ์ฅ๋์์ต๋๋ค.
- ์ฌ์ฉ์์๊ฒ ์ฝ๊ธฐ ์ ์ฉ ๋๋ ์ฐ๊ธฐ ์ ์ฉ ๊ถํ์ ํ ๋นํ ์ ์์ต๋๋ค. pg_read_all_data ๋ฐ pg_write_all_data ์ฌ์ ์ ์๋ ์ญํ ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ํ ์ด๋ธ, ๋ทฐ ๋ฐ ์คํค๋ง์ ๊ถํ์ ์ค์ ํ ์ ์์ต๋๋ค. user1์๊ฒ pg_read_all_data๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- ์๋ก์ด ์ค์น์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก md256 ๋์ SCRAM-SHA-5์ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ ์ธ์ฆ์ ์ํํฉ๋๋ค(postgresql.conf ์์ฑ ์ "password_encryption" ๋งค๊ฐ๋ณ์๋ ์ด์ 'scram-sha-256'์ผ๋ก ์ค์ ๋จ).
์ถ์ฒ : opennet.ru