[PostgreSQL] ํ๋ ์ต์ : work_mem
work_mem์ ์ฟผ๋ฆฌ ์ต์ ํ์ ์ค์ํ ์ฃผ์ ์ต์ ์ค ํ๋๋ค. ์ฃผ๋ก ์ ๋ ฌ์ ์ฌ์ฉ๋๋ค.
์ด๊ฑด ๋์คํฌ ์ค์บ ํ์, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ํน์ ์์
๋ค์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ๋๋ฅผ ์ ์ํ๋ค.
ORDER BY ์ฒ๋ฆฌ, ์ธ๋ฉ๋ชจ๋ฆฌ Hash JOIN, Merge Join์ฉ ์ ๋ ฌ ๋ฑ์ ํ์ฒ๋ฆฌ ์์
๋ค์ด work_mem์ ์ํฅ์ ๋ฐ๋๋ค.
๊ทธ๋์ work_mem์ด ๋ถ์กฑํ๋ค๋ฉด ๋์คํฌ ๊ธฐ๋ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๊ธ๊ฒฉํ ๋๋ ค์ง ์ ์๋ค.
work_mem์ ๊ธ๋ก๋ฒ ํ๋๊ฐ ์๋๋ผ ์์ ๋น ํ๋๋ก ์ ์ฉ๋๋ค. 10MB๋ก ๊ฑธ๋ ค์์ผ๋ฉด ํน์ ์์ ๋ง๋ค 10MB์ ํ๋ ๋ฒํท์ด ์ ์ฉ๋๋ ์ ์ด๋ค.
์ต์ ํ์ธ ๋ฐ ์กฐ์
show ๋ช ๋ น์ด๋ฅผ ํตํด ํฌ๊ธฐ๋ฅผ ํ์ธํ ์ ์๋ค.
๊ธฐ๋ณธ๊ฐ์ 4MB๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ฐ, ์ฌ๋ถํ ์์ด ์์ ํ ์ ์๋ ํ๋๊ทธ์ ์ํ๋ค.
๊ฐ๋ น AWS RDS์ ๊ฒฝ์ฐ์๋ ์ฌ๋ถํ ์์ด ์ฆ์ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค. DB ํ๋ผ๋ฏธํฐ ๊ทธ๋ฃน์ ๋ณ๊ฒฝํ๋ค.

์์คํ
์ ์ง์ ์ ์ดํ๋ ์ค์ด๋ผ๋ฉด "postgresql.conf"๋ฅผ ์ด์ด์ "work_mem = 64MB"์ฒ๋ผ ์์ ํ ๋ค์, reload๋ฅผ ํ๋ฉด ๋๋ค.
"SELECT pg_reload_conf();" ์ฟผ๋ฆฌ๋ฅผ ํตํด์๋ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฑ๋ฅ ์คํ
์ค์ ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋๋ ค๋ณด๋ฉด์ ์ผ๋ง๋ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋๋์ง, ์ด๋ป๊ฒ ์ ๊ทผํ๋ฉด ๋๋์ง ์์๋ณด์.
3000๋ง๊ฐ์ง๋ฆฌ ๋ํ ํ ์ด๋ธ์ ํ๋ ๋ง๋ ๋ค.
CREATE TABLE wm_sort_test AS
SELECT
g::bigint AS id,
((g::bigint * 48271) % 2147483647)::int AS sort_key
FROM generate_series(1, 30000000) AS g;
ANALYZE wm_sort_test;
SELECT pg_size_pretty(pg_total_relation_size('wm_sort_test'));
1GB ๋์ผ๋๊น ์ ๋ฒ ํฐ ํธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฟผ๋ฆฌ๋ฅผ ๋๋ ค๋ณด๋ฉด
5์ด ์ ๋๊ฐ ๊ฑธ๋ ธ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ณด๋ฉด ์ ๋ ฌ ๋ฐฉ๋ฒ์ "external merge Disk"๋ผ๊ณ ์กํ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ค. ์ด๊ฒ work_mem์ ์ฌ๋ฆฌ๊ธฐ ๋๋ฌด ์์์ ๋์คํฌ๋ก ์ ๋ ฌ์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค.
์ด์ work mem์ ์ฌ๋ ค์ ๋ ๋ ค๋ณด๋ฉด
์ด๋ฐ, ์ฌ์ ํ ์ข ๋ถ์กฑํ๋ค.
ํ
์ด๋ธ์ด 1GB๋ผ์ ๋ค ์์ฌ๋ผ๊ฐ๋ ๋ชจ์์ด๋.
์ด๋ฒ์ ๋๋ํ 4GB๋ฅผ ์ค๋ณด์
์ด๋ฒ์๋ ๋์คํฌ๊ฐ ์๋ด๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ํต์ํธ๋ก ์ ๋ ฌ์ ํ๊ณ , ์ฒ์๋ณด๋ค ์ข ๋นจ๋ผ์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ๊ฒฝ์ฐ์๋ ๊ฒฐ๊ณผ๊ฐ ๊ทน์ ์ด์ง๋ ์์ง๋ง, Join ์ด๊ฒ์ ๊ฒ ๋ถ๊ณ ํ๋ค๋ณด๋ฉด ํจ๊ณผ๋ ์ ์ ์ปค์ง๋ค.
์ฃผ์์ฌํญ
๋น์ฐํ ์ด๊ฑธ ๋ฌด์กฐ๊ฑด ํค์ฐ๋๊ฒ ๋ฅ์ฌ๊ฐ ์๋๊ณ , ๊ธฐ๋ณธ๊ฐ์ด 4MB์ธ ์ด์ ๊ฐ ์๋ค.
work_mem์ ํฌ๊ธฐ๊ฐ ํด์๋ก ์ ๋ ฌ ์์
์ด ๋ง์์ง์๋ก ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ๋ง์ด ์๋ชจํ๊ฒ ๋๋ค.
์ด์ ๋ฐ๋ผ ์์ฐํ OOM ๊ฐ๋ฅ์ฑ์ด ์ฆ๊ฐํ๊ณ , ์บ์ ๋ ๋ผ๊ฐ ํ๋ฅ ์ด ์ฆ๊ฐํ๊ณ , ๋์ ์ฒ๋ฆฌ๋์ด ๋จ์ด์ง ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๊ณต์์ ์ธ ๊ถ์ฅ์ฌํญ์ work_mem์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ณ , ํน์ ์ฟผ๋ฆฌ๋ง๋ค work_mem์ ์ง์ญ์ ์ผ๋ก ์ฌ๋ฆฌ๊ฒ ํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉ ์ด๋ฐ ์์ผ๋ก ๋ง์ด๋ค.
BEGIN;
SET LOCAL work_mem = '256MB';
SELECT ...;
COMMIT;
์ฐธ์กฐ
https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM