Reminder 
PostgreSQL์ Parallel Query์ ๋ํด ์ด์ด์ ์ด์ผ๊ธฐ ํ๊ธฐ์ ์์ ์ง๋ ์ฑํฐ์์ ์ด์ผ๊ธฐ ํ๋ ๋ด์ฉ์ ์์ฝํด๋ณด๊ฒ ์ต๋๋ค.
Parallel Query ์คํ ๊ณํ์๋ Gather ๋๋ Gather Merge ๋
ธ๋๊ฐ ์๊ณ , ์ด ๋
ธ๋์๋ ํญ์ ํ ๊ฐ์ ์์ ์คํ ๊ณํ์ด ์์ต๋๋ค. ๋ฉ์ธ ์ง์๋ฅผ ์ํํ๋ ํ๋ก์ธ์ค(Leader Worker)๊ฐ Gather ๋๋ Gather Merge ๋
ธ๋๋ฅผ ๋ง๋๋ฉด ์คํ ๊ณํ์์ ์ ๊ณตํ Parallel Worker ๊ฐ์๋งํผ Background Process ํ ๋น์ ์์ฒญํ๊ฒ ๋ฉ๋๋ค. ํ ๋น๋ Parallel Worker๋ Gather์ ์์ ์คํ ๊ณํ์ ๋ฐ์์ ๋ณ๋ ฌ๋ก ์ํํ๊ฒ ๋ฉ๋๋ค.
Parallel Query ์คํ ๊ณํ์ ๋ง๋ค ๋์๋ Parallel Safety ๊ท์น์ ์ค์ํฉ๋๋ค. Parallel Query ์คํ ๊ณํ์ Parallel Safe ๋๋ Parallel Restricted์ธ ๋
ธ๋๋ก๋ง ๊ตฌ์ฑ๋์ด์ผ ํ๋ฉฐ, Gather์ ์์ ์คํ ๊ณํ์ Parallel Safe์ธ ๋
ธ๋๋ก๋ง ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค. CTE๋ DML๊ณผ ๊ฐ์ Parallel Unsafeํ ๋
ธ๋๊ฐ ํ์ํ Path๋ Parallel Query ์คํ ๊ณํ์ผ๋ก ๋ง๋ค์ด์ง์ง ์์ต๋๋ค.
Overview 
์ด๋ฒ ์ฑํฐ์์๋ Parallel Query์ ์ค์ ์ํ ๊ณผ์ ์ ๋ํด์ ์ด์ผ๊ธฐํ๋ ค๊ณ ํฉ๋๋ค. Leader Worker๊ฐ ์ํํ๋ Gather ๋
ธ๋์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ค์ ์ ์ผ๋ก ๋ง์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
Shared Context for Parallel Query 
ํน์๋ ์ง์๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ์ํํ ์คํ ๊ณํ์ Parallel Worker์๊ฒ ๊ณต์ ํ๊ณ Leader Worker๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๊ณต์ ๋ฐ์ ์ ์๋ ๋ฐฉ๋ฒ๋ง ๋ง๋ จ๋๋ค๋ฉด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์์ ๋ค๋ฆ
๋๋ค. PostgreSQL์ Parallel Worker๋ ์ ๋ฌ ๋ฐ์ ์คํ ๊ณํ์ Executor Framework์ ๊ทธ๋๋ก ์ํ ์ํค๋๋ก ์ค๊ณ๋์ด ์์ผ๋ฉฐ, Executor๊ฐ ์คํ๋๊ธฐ ์ํด์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์๋ก ํ๋ ์ ๋ณด๋ค์ Leader Worker๊ฐ Parallel Worker์๊ฒ ์ ๋ฌํด์ผ๋ง ํฉ๋๋ค.
์๋ฅผ ๋ค์ด EXPLAIN ANALYZE ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ํํ ์ง์์ ๋ฐํ์ ํต๊ณ ์ ๋ณด๋ฅผ ์๊ณ ์ถ๋ค๊ณ ํ๋ค๋ฉด, Parallel Worker๋ ๊ฐ์ ํ๋ก์ธ์ค์์ ์คํ ๊ณํ์ ์ํํ๋ฉฐ ์์งํ ํต๊ณ ์ ๋ณด๋ฅผ Leader Worker์๊ฒ ๊ณต์ ํ๊ณ , Leader Worker๋ ์ฌ๋ฌ ํ๋ก์ธ์ค์ ํต๊ณ ์ ๋ณด๋ฅผ ์ง๊ณํ์ฌ ๋ณด์ฌ์ค์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์๋ฅผ ๋ค์ด๋ณด๋ฉด, ์ง์์ ์ฌ์ฉ๋๋ ๋ฐ์ธ๋ ๋ณ์(Bind Variable)์ Executor์ ๋ฐํ์ ์ต์์ ์ปจํ
์คํธ์ธ QueryDesc์ ํฌํจ๋์ด ์๋๋ฐ, ๋ฐ์ธ๋ ๋ณ์๋ฅผ Gather์ ์์ ์คํ ๊ณํ์์๋ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด Parallel Worker์๊ฒ ๋ฐ์ธ๋ ๋ณ์๋ฅผ ๊ณต์ ํด์ผ ์ ์์ ์ผ๋ก ์คํ ๊ณํ์ ์ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๋ ๋ฏ ์ง์๋ฅผ ์ํํ๊ธฐ ์ํด์ ํ์๋ก ํ๋ ์ ๋ณด๋ ๋ค์ํฉ๋๋ค. PostgreSQL์์๋ Leader Worker์ Parallel Worker ์ฌ์ด์ ๊ณต์ ํด์ผ ํ๋ ์ ๋ณด๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ๊ณต์ ํ์ฌ ํด๊ฒฐํฉ๋๋ค. Leader Worker๋ ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Dynamic Shared Memory) ์ธ๊ทธ๋จผํธ ํ ๋น์ ์์ฒญํ๊ณ ํด๋น ์ธ๊ทธ๋จผํธ์ ๊ณต์ ์ปจํ
์คํธ๋ฅผ ์ง๋ ฌํํ์ฌ ๋ณต์ฌํฉ๋๋ค.
Leader Worker๊ฐ ๊ณต์ ํ๋ ๊ณต์ ์ปจํ
์คํธ๋ ์๋์ ๊ฐ์ต๋๋ค.
Shared Context Entry | Shared Memory Lookup Key | Description |
Sub-plan | PARALLEL_KEY_PLANNEDSTMT | Parallel Worker๊ฐ ์ํํด์ผ ํ๋ ์์ ์คํ ๊ณํ. ํธ๋ฆฌ ํํ์ ์คํ ๊ณํ์ ์ง๋ ฌํ ํ์ฌ ๊ณต์ ํจ. |
Bind Parameter List | PARALLEL_KEY_PARAMLISTINFO | ์ง์์ ํฌํจ๋ ๋ฐ์ธ๋ ๋ณ์ ์ ๋ณด. |
Instrumentation | PARALLEL_KEY_INSTRUMENTATION | Executor ๋ฐํ์ ํต๊ณ ์ ๋ณด. ๊ฐ Parallel Worker๊ฐ ์์งํ๊ณ , Leader Worker๊ฐ ์ง๊ณํจ. |
Buffer Usage | PARALLEL_KEY_BUFFER_USAGE | Parallel Worker๊ฐ ์ฌ์ฉํ Buffer Cache ์ฌ์ฉ๋ ์ ๋ณด. |
WAL Usage | PARALLEL_KEY_WAL_USAGE | Parallel Worker๊ฐ ์ฌ์ฉํ WAL ์ฌ์ฉ๋ ์ ๋ณด. |
JIT Instrumentation | PARALLEL_KEY_JIT_INSTRUMENTATION | JIT Compilation ๊ด๋ จ ํต๊ณ ์ ๋ณด. |
Tuple Queue | PARALLEL_KEY_TUPLE_QUEUE | Parallel Worker๊ฐ Leader Worker์๊ฒ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ฌํ๋ Message Queue. |
Query Text | PARALLEL_KEY_QUERY_TEXT | ์ํ ์ค์ธ ์ง์ |
DSA | PARALLEL_KEY_DSA | Leader Worker์ Parallel Worker๊ฐ Executor ์ํ ์ค์ ๊ณต์ ํ ๊ฐ๋ณ ๊ธธ์ด์ ์ ๋ณด๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ ์ ์๋๋ก ๋ง๋ จํด ๋์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๊ณต๊ฐ |
Fixed Parallel Executor State | PARALLEL_KEY_EXECUTOR_FIXED | ๊ธฐํ Executor ์ํ ์ ๋ณด |
Parallel Aware Plan Nodeโs Context | ๊ฐ Plan Node์ ID | ์คํ ๊ณํ์ ํฌํจ๋ Parallel Aware ํ ๋
ธ๋๊ฐ ๊ณต์ ํด์ผ ํ๋ ์ปจํ
์คํธ. ํค๋ ์์ ์ Plan Node ID๋ก ๋ฑ๋กํจ. |
์์ ๊ฐ์ High-level์ ์ ๋ณด ์ธ์๋ ๊ฐ Parallel Worker๊ฐ ์ง์ ์ํ์ ํ์ํ ์์ํ๊ณ ๋ค์ํ ์ ๋ณด๋ ์์ต๋๋ค. ํด๋น ์ ๋ณด๋ค์ ์ด ํฌ์คํ
์์ ๋์ด ํ์ง๋ ์๊ฒ ์ง๋ง, ๊ถ๊ธํ์ ๋
์๋ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
Leader Worker๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต์ ์ปจํ
์คํธ ์ํธ๋ฆฌ๋ฅผ ํ ๋นํ ํ Parallel Worker๊ฐ ํด๋น ์ํธ๋ฆฌ๋ฅผ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๊ฐ ์ํธ๋ฆฌ๊ฐ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์์์ผ ํฉ๋๋ค. PostgreSQL์์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ์ํธ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์๋๋ก Lookup ํค(Key)๋ฅผ Table of Content(TOC)์ ๊ฐ์ด ๋ฑ๋กํด์ค๋๋ค. Leader Worker๊ฐ ์ํธ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉด์ 64-bit ์ ์๋ก ๋ ํค๋ฅผ ๋ฑ๋กํด์ฃผ๊ณ , Parallel Worker๋ Lookup ํจ์์ ํ์๋ก ํ๋ ์ํธ๋ฆฌ์ ํค๋ฅผ ์ฃผ์
ํ์ฌ ์ํธ๋ฆฌ์ ์์น๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์
๋๋ค (C++ Boost Library๊ฐ ์ต์ํ ๊ฐ๋ฐ์๋ boost::interprocess::managed_shared_memory ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ์ฌ๋ฆด ๊ฒ์
๋๋ค). ์๋ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ์ฝ์ต๋๋ค.
/* Parallel Worker์ ์ปค๋ฎค๋์ผ์ด์
์ ์ํ Magic Number */
#define PARALLEL_KEY_EXECUTOR_FIXED UINT64CONST(0xE000000000000001)
#define PARALLEL_KEY_PLANNEDSTMT UINT64CONST(0xE000000000000002)
#define PARALLEL_KEY_PARAMLISTINFO UINT64CONST(0xE000000000000003)
#define PARALLEL_KEY_BUFFER_USAGE UINT64CONST(0xE000000000000004)
#define PARALLEL_KEY_TUPLE_QUEUE UINT64CONST(0xE000000000000005)
#define PARALLEL_KEY_INSTRUMENTATION UINT64CONST(0xE000000000000006)
#define PARALLEL_KEY_DSA UINT64CONST(0xE000000000000007)
#define PARALLEL_KEY_QUERY_TEXT UINT64CONST(0xE000000000000008)
#define PARALLEL_KEY_JIT_INSTRUMENTATION UINT64CONST(0xE000000000000009)
#define PARALLEL_KEY_WAL_USAGE UINT64CONST(0xE00000000000000A)
...
/* Buffer Usage๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๋ฉฐ key ๋ฑ๋ก */
bufusage_space = shm_toc_allocate(pcxt->toc,
mul_size(sizeof(BufferUsage), pcxt->nworkers));
shm_toc_insert(pcxt->toc, PARALLEL_KEY_BUFFER_USAGE, bufusage_space);
pei->buffer_usage = bufusage_space;
/* WAL Usage๋ ๋ง์ฐฌ๊ฐ์ง๋ก key ๋ฑ๋ก */
walusage_space = shm_toc_allocate(pcxt->toc,
mul_size(sizeof(WalUsage), pcxt->nworkers));
shm_toc_insert(pcxt->toc, PARALLEL_KEY_WAL_USAGE, walusage_space);
pei->wal_usage = walusage_space;
C
๋ณต์ฌ
DSM ๊ณต๊ฐ์ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ์๋ ์ ํฉํ์ง ์์ ๊ตฌ์กฐ๋ก ๋์ด ์์ต๋๋ค. ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ฌ์ด์ฆ๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํ๊ณ ๊ทธ์ ๋ง์ถฐ DSM ์ธ๊ทธ๋จผํธ๋ฅผ ํ ๋นํฉ๋๋ค. ์ดํ DSM ์ธ๊ทธ๋จผํธ์ ์ํธ๋ฆฌ๋ฅผ ํ ๋นํ ๋์๋ ์ธ๊ทธ๋จผํธ ๋ด ๋ฒํผ์ ์คํ์
๊ฐ๋ง ์กฐ์ ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ํ ๋นํฉ๋๋ค. ๋ฐ๋ผ์ ์คํ ๊ณํ์ PlannedStmt์ ๊ฐ์ด ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋์ด ์๋ ์ํธ๋ฆฌ๋ฅผ ์ผ๋ฐ์ ์ธ Heap ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๋ฏ์ด DSM ๊ณต๊ฐ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด, ํธ๋ฆฌ ๋
ธ๋๋ฅผ ์ํํ๊ธฐ ์ํ ํฌ์ธํฐ ๊ฐ๋ค์ ๋งค๋ฒ ๊ต์ฒดํด์ค์ผ ํ๋ ์ด๋ ค์์ด ์๊น๋๋ค. ์ด๋ฐ ์ด๋ ค์์ ๋ฐฉ์งํ๊ธฐ ์ํด PostgreSQL์์๋ ํธ๋ฆฌ๋ฅผ ๋ฌธ์์ด ํ์
์ผ๋ก ์ง๋ ฌํ ํ์ฌ DSM ๊ณต๊ฐ์ ๊ณต์ ํฉ๋๋ค. ์ด๋ ๊ฒ ์ง๋ ฌํ ํ ํธ๋ฆฌ๋ฅผ Parallel Worker๋ ์ญ์ง๋ ฌํ ํ์ฌ ์์ ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ค์ ํธ๋ฆฌ ํํ๋ก ๋ณต์ํ๋ ์์
์ ๊ฑฐ์ณ ์คํ ๊ณํ์ ์ํํฉ๋๋ค.
๋ ํ๋ ์์ธํ ๋ด์ผ ํ ๊ฒ์ Tuple Queue์
๋๋ค. Leader Worker๋ Parallel Worker์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์ ์์ ์คํ ๊ณํ์ ์ํํฉ๋๋ค. ์ด ๋ Parallel Worker์๊ฒ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์ Message Queue๋ฅผ ๊ฐ Parallel Worker ๋ง๋ค ์์ฑํฉ๋๋ค. Leader Worker๋ ์์ ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ Message Queue ๋ฒํผ๋ฅผ ์ฐธ์กฐํ๋ Message Queue ํธ๋ค์ ํ ๋นํฉ๋๋ค. Message Queue ๋ฒํผ๋ DSM ๊ณต๊ฐ์ Parallel Worker ๊ฐ์๋ฅผ ๊ณฑํ์ฌ ์ฐ์๋ ๊ณต๊ฐ์ ํ ๋นํ๊ณ , ๊ฐ Message Queue ํธ๋ค์ ๋ฒํผ์ ์คํ์
์ ์ฎ๊ฒจ๊ฐ๋ฉฐ ์ฐธ์กฐ๋ฅผ ๋ง๋ค์ด ๋์ต๋๋ค. Parallel Worker๋ Executor์์ Client์ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ฒด์ธ DestReceiver ๋ฅผ ์์ ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๊ณ DSM ๊ณต๊ฐ์ ํ ๋น๋ ์์ ์ Message Queue ๋ฒํผ๋ฅผ ์ฐธ์กฐํ๊ฒ ์ค์ ํ์ฌ ๊ฒฐ๊ณผ๋ฌผ์ ๊ณต์ ํฉ๋๋ค.
Launching Parallel Workers 
Parallel Worker์ ๊ณต์ ํ ์ ๋ณด๋ฅผ DSM ์ธ๊ทธ๋จผํธ์ ํ ๋นํ์ผ๋ฉด Parallel Worker๋ฅผ ์์ํ ์ค๋น๊ฐ ๋์์ต๋๋ค. Parallel Worker๋ Background Process๋ก ์คํ๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก PostgreSQL์์ Background Process๋ฅผ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ ๋์ผํ๊ฒ ์ฌ์ฉํฉ๋๋ค. Leader Worker๊ฐ Background Process๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์๋ ์คํ
์ ๋ฐ๋ผ๊ฐ๋๋ค.
1.
Background Process์ ์ํ ์ ๋ณด๋ฅผ ๋ด์ ์ฌ๋กฏ์ ์ ๊ทผํฉ๋๋ค.
a.
๊ฐ ์ฌ๋กฏ์๋ Background Process์ ๋ํ ๋ค์ํ ์ ๋ณด๊ฐ ์๋๋ฐ, ํ์ฌ ์๊ฐํ๋ ๋ก์ง์์๋ ์๋ ํ๋๋ง ์ค์ํ๊ฒ ๋ณด๋ฉด ๋ฉ๋๋ค.
โข
in_use: Background Process๊ฐ ํ์ฌ ์ฌ์ฉ ์ค์ธ์ง ํ์ธํ ์ ์๋ ํ๋๊ทธ
โข
bgw_function_name: Background Process๊ฐ ํธ์ถํ Entrypoint ํจ์ ์ด๋ฆ
โข
pid: Background Process์ ํ๋ก์ธ์ค ์์ด๋
2.
Leader Worker๋ ์ฌ๋กฏ์ ์ํํ๋ฉฐ in_use ํ๋๊ทธ๊ฐ false ๊ฐ์ธ ๊ณต๊ฐ์ ์ฐพ์ต๋๋ค.
3.
์ฐพ์ ์ฌ๋กฏ์ ํ๋๋ฅผ ์ค์ ํฉ๋๋ค.
a.
bgw_function_name = ParallelWorkerMain
b.
pid = InvalidPID (PostMaster๊ฐ ์์๋์ง ์์ Background Process๋ฅผ ์ฐพ๊ธฐ ์ํ ๋ฐฉ๋ฒ)
c.
in_use = true
4.
PostMaster์๊ฒ PMSIGNAL_BACKGROUND_WORKER_CHANGE ์๊ทธ๋์ ๋ณด๋ด Background Process์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์์ ์๋ ค์ค๋๋ค.
5.
PostMaster๋ Background Process ์ฌ๋กฏ์ ์ํํ๋ฉฐ ์์๋์ง ์์ Process๋ฅผ ์ฐพ์ ์คํ์์ผ ์ค๋๋ค.
Optimizer๊ฐ ์์ฑํ ์คํ ๊ณํ์ ๋ช
์๋ Parallel Worker ์๋งํผ Background Process๋ฅผ ํ ๋น์ํค๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ฉด ์ ๋ฐฉ์ ๋๋ก ๋ฌธ์ ์์ด ์ํ๋์ง๋ง ๋์์ ๋๋ฌด ๋ง์ Parallel Worker๋ฅผ ํ ๋นํ๊ฒ ์์ฉํ๋ค๊ฐ๋ ์์คํ
์์ ์ฌ์ฉํ ์ ์๋ ์ปดํจํ
์์์ ์ด๊ณผํ๋ ์ผ์ด ๋ฐ์ํ์ฌ ๋ฌธ์ ๊ฐ ์ผ์ด๋ ์ ์์ต๋๋ค.
์ด๋ฐ ์ํฉ์ ์ฐ๋ คํ์ฌ PostgreSQL์์๋ max_parallel_worker ํ๋ผ๋ฏธํฐ๋ฅผ ๋ง๋ จํ์ต๋๋ค. Leader Worker๊ฐ Parallel Worker๋ฅผ ํ ๋นํ๋ฌ ํจ์์ ์ง์
ํ์ ๋ ํ์ฌ ์์ฑํ Parallel Worker ๊ฐ์๊ฐ max_parallel_worker๋ฅผ ์ด๊ณผํ๋ค๋ฉด ๋ ์ด์ ํ ๋น์ ์๋ํ์ง ์๊ณ ํ ๋นํ ๊ฐ์์ ๋ง์กฑํ๋ฉฐ ์ํ์ ์ด์ด๊ฐ๋๋ค. ๋ง์ฝ Parallel Worker๋ฅผ ํ ๋นํ์ง ๋ชป ํ์ ๊ฒฝ์ฐ Leader Worker๊ฐ ํผ์์ ์์ ์คํ ๊ณํ์ ์ํํ ์ ์๋๋ก ๋ฉ์ปค๋์ฆ์ด ๋ง๋ จ๋์ด ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ Optimizer๊ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ ํฉํ๊ฒ ์์ฑํ ์คํ ๊ณํ์ Leader Worker ํผ์์ ์ํํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋์ ๋ฐ๋ผ ์๋นํ ํฐ ๋นํจ์จ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Receiving Tuples 
๋ง์ง๋ง์ผ๋ก Leader Worker๊ฐ Parallel Worker๋ก๋ถํฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์์ค๋ ๊ณผ์ ์ ๋ํด ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ์์ ์ค๋ช
์์ DSM ์ธ๊ทธ๋จผํธ์ Leader Worker๊ฐ Parallel Worker ๊ฐ์๋งํผ Tuple Queue๋ฅผ ํ ๋นํ๋ค๊ณ ๋ง์ ๋๋ ธ์ต๋๋ค. Parallel Worker๋ DSM ์ธ๊ทธ๋จผํธ์์ ์์ ์๊ฒ ํ ๋น๋ Tuple Queue๋ฅผ ๋ฐ์์ ์์ ์ Executor Frame๊ณผ ๊ฒฐํฉํฉ๋๋ค. ์์ ์คํ ๊ณํ์ ์ํํ๋ฉด์ ๋ฐ์ํ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฒฐํฉํ Tuple Queue์ ์ฝ์
ํ๋ฉด Leader Worker๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์๊ฐ๋ ๋ฐฉ์์ผ๋ก ์ํ๋ฉ๋๋ค.
Leader Worker์ ์
์ฅ์์๋ ์ฌ๋ฌ Parallel Worker๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ด์ด Tuple Queue๋ฅผ ํตํด ์ ๋ฌํ๊ฒ ๋๋๋ฐ Gather ๋
ธ๋์ ๊ฒฝ์ฐ ์์์ ์๊ด ์์ด ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ณผ๋ฌผ์ ๊บผ๋ด์ด ์์ ์คํ ๊ณํ์ผ๋ก ์ฎ๊น๋๋ค.
์ฌ๊ธฐ์ ์จ๊ฒจ์ง ์ต์ ํ ํฌ์ธํธ๊ฐ ์์ต๋๋ค. Leader Worker๋ ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก Tuple Queue๋ฅผ ์ํํ๋ Parallel Worker๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ด๊ธฐ ๊น์ง ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด 4๊ฐ์ Parallel Worker๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ด๊ณ ์์ ๋ Leader Worker๋ 0๋ฒ Queue๋ถํฐ ์ํ๋ฅผ ํ๋ฉฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์๊ฐ๋ ค๊ณ ํฉ๋๋ค. ๋ง์ฝ 0๋ฒ Queue์ ๊ฒฐ๊ณผ๋ฌผ์ด ๊ณต์ ๋์ง ์์๋ค๋ฉด Leader Worker๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ Queue๋ก ๊ฐ์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์์ต๋๋ค.
Tuple์ ์์ฑํ Tuple Queue๋ฅผ ์ฐพ์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์๊ฐ๋๋ค
๋ง์ฝ 1๋ฒ Queue์ ๊ฒฐ๊ณผ๋ฌผ์ด ์์ด์ ํด๋น ํํ์ ์์ ์คํ ๊ณํ์ผ๋ก ์ ๋ฌํ๊ณ ๋ค์ ๋์์ค๊ฒ ๋๋ฉด ๋ค์ 0๋ฒ Queue๋ถํฐ ์ํํ๋ ๊ฒ์ด ์๋๋ผ 1๋ฒ Queue๋ถํฐ ๊ฒฐ๊ณผ๋ฌผ์ด ์๋์ง ํ์ธํฉ๋๋ค. ๋ฐฉ๋ฌธํ๋ Tuple Queue์ ๋ ์ด์ Tuple์ด ์ ์๊ฐ์ ๋์ค์ง ์์ ๋๊น์ง ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ Tuple์ ๋ฐ์๊ฐ๋๋ค.์ด๋ ๊ฒ ๋ก์ง์ด ๊ตฌ์ฑ๋์ด ์๋ ์ด์ ๋ ์ ์ผ ๋น ๋ฅธ ์๋๋ก ์์
์ ์ํํ๋ Parallel Worker ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ๋ฌผ์ ์ฒ๋ฆฌํ๋ฉด์ ๋ค๋ฅธ Parallel Worker์๊ฒ ๋ง์ ์์
์ ์ํํ ์ ์๋ ๊ธฐํ๋ฅผ ์ค ์ ์๊ฒ ํ์ฌ ํจ์จ์ฑ์ ๋์ผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ค์ ๋์์์ ๋๋ ๋ฐฉ๋ฌธํ๋ Tuple Queue์์ Tuple์ด ์์ง๋ ๋๊น์ง ๋ฐ์์ต๋๋ค. ๋ค๋ฅธ Parallel Worker๊ฐ ๋ง์ ์คํ ๊ณํ์ ์ํํ์ฌ Tuple์ ์์ฑํ ์ ์๋๋ก ๊ธฐ๋ค๋ ค์ฃผ๋ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ง์ฝ Queue๋ฅผ ๋ชจ๋ ์ํํ์ง๋ง ๋ชจ๋ Parallel Worker๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ฌํ์ง ์์๋ค๋ฉด Leader Worker์๊ฒ๋ ๋ ๊ฐ์ง ์ ํ์ด ์ฃผ์ด์ง๋๋ค. ์ฒซ ๋ฒ์งธ๋ Leader Worker ๋ณธ์ธ์ด ์ง์ ์์ ์คํ ๊ณํ์ ์ํํ์ฌ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด ๋ด๋ ๊ฒ์
๋๋ค. ๋ ๋ฒ์งธ๋ Parallel Worker ์ค ํ๋๋ผ๋ ๋จผ์ ๋๋ด๋ Worker๊ฐ ์๊ธธ ๋๊น์ง ๋๊ธฐํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ฒซ ๋ฒ์งธ ์ ํ์ parallel_leader_participation ํ๋ผ๋ฏธํฐ๊ฐ ์ผ์ ธ ์๋ ๊ฒฝ์ฐ ํ์ฑํ๋๊ณ , ๋ ๋ฒ์งธ ์ ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ๊บผ์ ธ ์์ ๊ฒฝ์ฐ ํ์ฑํ ๋ฉ๋๋ค.
Conclusion
์ค๋ ์๊ฐํ Parallel Query์ ์คํ ๋ถ๋ถ์ ์์ฝํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
โข
Parallel Query์ ํ์ํ ๊ณต์ฉ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด Leader Worker๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(DSM) ์ธ๊ทธ๋จผํธ๋ฅผ ํ ๋นํ๊ณ ๊ฐ์ข
์ ๋ณด๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฝ๋๋ค.
โข
Leader Worker๊ฐ Parallel Worker๋ฅผ ์คํ์ํค๊ธฐ ์ํด Background Worker Slot์ ์ํํ์ฌ ๊ฐ์ฉ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ต๋๋ค. ๊ฐ์ฉ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ผ๋ฉด ์คํํ Entrypoint ํจ์๋ฅผ ์ค์ ํด์ฃผ๊ณ PostMaster์๊ฒ ์๊ทธ๋์ ๋ณด๋ด Background Worker๊ฐ ์คํ๋๋๋ก ํฉ๋๋ค.
โข
Background Process๊ฐ ์์ฑํ ํํ์ ๋ฐ๊ธฐ ์ํด ๋ฉ์์ง ํ๋ฅผ ์ํํฉ๋๋ค. ์ด ๋ ๋ชจ๋ ๋ฉ์์ง ํ์ ์์ฑ๋ ํํ์ด ์๋ ๊ฒฝ์ฐ, parallel_leader_participation ํ๋ผ๋ฏธํฐ๊ฐ ์ผ์ ธ ์์ผ๋ฉด Leader Worker๊ฐ ์ง์ ์์ ์คํ ๊ณํ์ ์ํํ์ฌ ํํ์ ์์ฑํฉ๋๋ค.
๋ค์ Parallel Query ์๋ฆฌ์ฆ์์๋ Parallel Worker๊ฐ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฐฐํ์ฌ ์ค์บ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์กฐ์ธ๊ณผ ์ง๊ณํจ์์ ๊ฐ์ ์ฐ์ฐ์ ๋ณ๋ ฌ๋ก ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์์๋ณด๋๋ก ํ๊ณ ์ค๋ ํฌ์คํ
์ ์ด๋ง ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
์ง๊ธ๊น์ง PostgreSQL์ Parallel Query (2)์ ๊ดํด ์์๋ณด์์ต๋๋ค
PostgreSQL์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ฉํ ํ์ ๊ฐ์ง๊ณ ๋์์ค๊ฒ ์ต๋๋ค.
๋ค์ ์ปจํ
์ธ ๋ ๊ธฐ๋ํด์ฃผ์ธ์! (์ปจํ
์ธ ๋ ๊ฒฉ์ฃผ ์
๋ฐ์ดํธ ๋ฉ๋๋ค.)
PostgreSQL ์ Internal Architecture ํฌ์คํ
์ ์ฒ์๋ถํฐ ๋ณด์๋ ค๋ฉด ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํด์ฃผ์ธ์!