[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

Search