์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๋ง์ ๋ถ๋ค์ด
... ํด๋น ๊ณํ ๋
ธ๋์ ๋ํ ์ํฉ๋ณ ํํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆ๋ต๊ฒ ๋์์ธ๋ ์ฟผ๋ฆฌ๋ก ๋ณํํฉ๋๋ค.
๊ทธ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ์ฌ๋ณธ์์
์ผ๋ฐ์ ์ธ ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์ ์ ๊ทธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ๊ธฐ๋ก์ ๊ธฐ์ฌ์์ ์ฐพ์ ์ ์์ต๋๋ค.
"๋ณ๋ SQL ์ฟผ๋ฆฌ์ ๋ํ ๋ ์ํผ" .
๋จผ์ ์ฑ์์ ์์ํ๊ฒ ์ต๋๋ค. ๋ ์ด์ ๊ณํ์ ์ฑ์ํ์ง ์๊ณ ์ด๋ฏธ ์ฑ์ํ์ผ๋ฉฐ ์ด๋ฏธ ์๋ฆ๋ต๊ณ ์ดํดํ ์ ์์ง๋ง ์์ฒญ์ด ์์ต๋๋ค.
ํ์์ด ์ง์ ๋์ง ์์ "์ํธ"๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์์ ๊ฐ์ ธ์จ ์์ฒญ์ ๋งค์ฐ ๋ณด๊ธฐ ํํ๊ณ ๋ฐ๋ผ์ ๋ถํธํ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค.
ํนํ ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ์์ฒญ ๋ณธ๋ฌธ์ ํ ์ค์ "์ ์ฐฉ"ํ๋ ๊ฒฝ์ฐ(๋ฌผ๋ก ์ํฐํจํด์ด์ง๋ง ๋ฐ์ํฉ๋๋ค). ๋์ฐํด!
์ข ๋ ์๋ฆ๋ต๊ฒ ๊ทธ๋ ค๋ณด์.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์๋ฆ๋ต๊ฒ ๊ทธ๋ฆด ์ ์๋ค๋ฉด, ์ฆ ์์ฒญ ๋ณธ๋ฌธ์ ๋ถํดํ๊ณ ๋ค์ ์กฐ๋ฆฝํ ์ ์๋ค๋ฉด ์ด ์์ฒญ์ ๊ฐ ๊ฐ์ฒด์ ํํธ(๊ณํ์ ํด๋น ์ง์ ์์ ๋ฐ์ํ ์ผ)๋ฅผ "์ฒจ๋ถ"ํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ํธ๋ฆฌ
์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋จผ์ ์์ฒญ์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํฉ๋๋ค.
์๋ํ๋ฉด ์ฐ๋ฆฌ๋
์์ฒญ ๋ณธ๋ฌธ์ ํจ์์ ๋ํ ์
๋ ฅ์ผ๋ก ์ ๊ณตํฉ๋๋ค. ์ถ๋ ฅ์์ โโJSON ๊ฐ์ฒด ํ์์ ๊ตฌ๋ฌธ ๋ถ์๋ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ์ป์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์ด ํธ๋ฆฌ๋ฅผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์คํํ๊ณ ์ํ๋ ๋ค์ฌ์ฐ๊ธฐ, ์์ ๋ฐ ์์์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์กฐํฉํ ์ ์์ต๋๋ค. ์๋์, ๋ง์ถค ์ค์ ํ ์๋ ์์ง๋ง ์ด๊ฒ์ด ํธ๋ฆฌํ ๊ฒ ๊ฐ์์ต๋๋ค.
์ฟผ๋ฆฌ ๋ฐ ๊ณํ ๋ ธ๋ ๋งคํ
์ด์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ๋ถ์ํ ๊ณํ๊ณผ ๋ ๋ฒ์งธ ๋จ๊ณ์์ ๋ถ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ฒฐํฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋จํ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. CTE๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๋ ๋ฒ ์ฝ๋ ์ฟผ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๊ทธ๋ฌํ ๊ณํ์ ์ธ์๋๋ค.
CTE
์ ๋ณด๋ฉด ๋ฒ์ 12๊น์ง(ํน์ ๊ทธ๊ฒ๋ถํฐ ํค์๋๋ก ์์ํด์) MATERIALIZED
) ํ์ฑ
์ฆ, ์์ฒญ ์ด๋๊ฐ์ CTE ์์ฑ์ด ์๊ณ ๊ณํ ์ด๋๊ฐ์ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ CTE
, ๊ทธ๋ฌ๋ฉด ์ด๋ค ๋
ธ๋๋ ํ์คํ ์๋ก "์ธ์"ํ๋ฏ๋ก ์ฆ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
๋ณํ ๋ฌธ์ : CTE๋ ์ค์ฒฉ๋ ์ ์์ต๋๋ค.
์ค์ฒฉ์ด ๋งค์ฐ ๋ถ๋ํ๊ณ ์ฌ์ง์ด ๊ฐ์ ์ด๋ฆ์ ๊ฒ๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ด๋ถ์์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค. CTE A
~์ํ๋ค CTE X
, ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ๋ ๊ฐ์ ์์ค์ ์์ต๋๋ค CTE B
๋ค์ ํ CTE X
:
WITH A AS (
WITH X AS (...)
SELECT ...
)
, B AS (
WITH X AS (...)
SELECT ...
)
...
๋น๊ตํ ๋ ์ด๊ฒ์ ์ดํดํด์ผํฉ๋๋ค. ์ด๊ฒ์ โ๋์ผ๋กโ ์ดํดํ๋ ๊ฒ, ์ฌ์ง์ด ๊ณํ์ ๋ณด๋ ๊ฒ, ์ฌ์ง์ด ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ณด๋ ๊ฒ์กฐ์ฐจ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. CTE ์์ฑ์ด ๋ณต์กํ๊ณ ์ค์ฒฉ๋์ด ์์ผ๋ฉฐ ์์ฒญ์ด ํฌ๋ค๋ฉด ์์ ํ ๋ฌด์์์ ์ ๋๋ค.
UNION
๊ฒ์์ด์ ํค์๋๊ฐ ์๋ ๊ฒฝ์ฐ UNION [ALL]
(๋ ์ํ์ ๊ฒฐํฉํ๋ ์ฐ์ฐ์) ๊ณํ์์๋ ๋
ธ๋ ์ค ํ๋์ ํด๋นํฉ๋๋ค. Append
, ๋๋ ์ผ๋ถ Recursive Union
.
์์ "์"์ ์๋ ๊ฒ UNION
- ์ด๊ฒ์ "์๋"์ ์๋ ์ฐ๋ฆฌ ๋
ธ๋์ ์ฒซ ๋ฒ์งธ ์์์
๋๋ค. ๋ง์ฝ ํต๊ณผํ๋ค๋ฉด UNION
ํ ๋ฒ์ ์ฌ๋ฌ ๋ธ๋ก์ "์ ์ฐฉ"ํ ๋ค์ Append
-์ฌ์ ํ ํ๋์ ๋
ธ๋๋ง ์์ง๋ง ๋ ๊ฐ๊ฐ ์๋ ๋ง์ ์์์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ฐ๊ฐ ์์๋๋ก:
(...) -- #1
UNION ALL
(...) -- #2
UNION ALL
(...) -- #3
Append
-> ... #1
-> ... #2
-> ... #3
๋ณํ ๋ฌธ์ : ๋ด๋ถ ์ฌ๊ท ์ํ๋ง ์์ฑ(WITH RECURSIVE
)์ ๋ ์ด์์ผ ์๋ ์์ต๋๋ค. UNION
. ๊ทธ๋ฌ๋ ๋ง์ง๋ง ๋ธ๋ก ๋ค์์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ธ๋ก๋ง ํญ์ ์ฌ๊ท์ ์
๋๋ค. UNION
. ์์ ๋ชจ๋ ๊ฒ์ ํ๋์ด์ง๋ง ๋ค๋ฆ
๋๋ค. UNION
:
WITH RECURSIVE T AS(
(...) -- #1
UNION ALL
(...) -- #2, ััั ะบะพะฝัะฐะตััั ะณะตะฝะตัะฐัะธั ััะฐััะพะฒะพะณะพ ัะพััะพัะฝะธั ัะตะบัััะธะธ
UNION ALL
(...) -- #3, ัะพะปัะบะพ ััะพั ะฑะปะพะบ ัะตะบัััะธะฒะฝัะน ะธ ะผะพะถะตั ัะพะดะตัะถะฐัั ะพะฑัะฐัะตะฝะธะต ะบ T
)
...
๋ํ ๊ทธ๋ฌํ ์๋ฅผ "๋๋ณด์ด๊ฒ" ํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด ์์์ ์ฐ๋ฆฌ๋ UNION
-์์ฒญ์๋ 3๊ฐ์ ์ธ๊ทธ๋จผํธ๊ฐ ์์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ํ๋์ UNION
์ผ์น Append
-๋
ธ๋, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋
ธ๋ - Recursive Union
.
๋ฐ์ดํฐ ์ฝ๊ธฐ-์ฐ๊ธฐ
๋ชจ๋ ๊ฒ์ด ์ค๋น๋์์ผ๋ฏ๋ก ์ด์ ์์ฒญ์ ์ด๋ ๋ถ๋ถ์ด ๊ณํ์ ์ด๋ ๋ถ๋ถ์ ํด๋นํ๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ํ๋ค ์์์ ์ฐ๋ฆฌ๋ '์ฝ์ ์ ์๋' ๋์์ ์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ๊ด์ ์์๋ ํ
์ด๋ธ์ธ์ง CTE์ธ์ง๋ ์ ์ ์์ง๋ง ๋์ผํ ๋
ธ๋๋ก ์ง์ ๋ฉ๋๋ค. RangeVar
. ๊ทธ๋ฆฌ๊ณ "๊ฐ๋
์ฑ" ์ธก๋ฉด์์ ์ด๊ฒ์ ์๋นํ ์ ํ๋ ๋
ธ๋ ์งํฉ์ด๊ธฐ๋ ํฉ๋๋ค.
Seq Scan on [tbl]
Bitmap Heap Scan on [tbl]
Index [Only] Scan [Backward] using [idx] on [tbl]
CTE Scan on [cte]
Insert/Update/Delete on [tbl]
์ฐ๋ฆฌ๋ ๊ณํ๊ณผ ์ฟผ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์๊ณ , ๋ธ๋ก์ ๋์ ๊ด๊ณ๋ฅผ ์๊ณ , ๊ฐ์ฒด์ ์ด๋ฆ์ ์๊ณ ์์ต๋๋ค. ์ผ๋์ผ ๋น๊ต๋ฅผ ์ํํฉ๋๋ค.
๋ค์ "๋ณํ๊ฐ ์๋" ์์
. ์์ฒญ์ ๋ฐ์ ์คํํฉ๋๋ค. ๋ณ์นญ์ด ์์ต๋๋ค. ๋์ผํ CTE์์ ๋ ๋ฒ๋ง ์ฝ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ณํ์ ๋ด
๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์
๋๊น? ์ ๋ณ์นญ์ด ์๊ฒผ๋์? ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฃผ๋ฌธํ์ง ์์์ต๋๋ค. ๊ทธ๋ฐ "์ซ์ ๋ฒํธ"๋ ์ด๋์ ์ป์ต๋๊น?
PostgreSQL์ ์ด๋ฅผ ์์ฒด์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค. ๊ทธ๊ฒ๋ง ์ดํดํ๋ฉด ๋๋ค ๊ทธ๋ฅ ๊ทธ๋ฐ ๋ณ์นญ ์ฐ๋ฆฌ์๊ฒ๋ ๊ณํ๊ณผ์ ๋น๊ต ๋ชฉ์ ์ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ๋จ์ํ ์ฌ๊ธฐ์ ์ถ๊ฐ๋ฉ๋๋ค. ๊ทธ ์ฌ๋์๊ฒ ๊ด์ฌ์ ๊ธฐ์ธ์ด์ง ๋ง์.
์ด "๋ณํ๊ฐ ์๋" ์์
: ๋ถํ ๋ ํ
์ด๋ธ์์ ์ฝ๋ ๊ฒฝ์ฐ ๋
ธ๋๋ฅผ ์ป์ต๋๋ค. Append
๋๋ Merge Append
, ์ด๋ ๋ง์ ์์ "์ด๋ฆฐ์ด"๋ก ๊ตฌ์ฑ๋๋ฉฐ ๊ฐ๊ฐ์ ์ด๋ป๊ฒ ๋ Scan
'om ํ
์ด๋ธ ์น์
์์ : Seq Scan
, Bitmap Heap Scan
๋๋ Index Scan
. ๊ทธ๋ฌ๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ด๋ฌํ "ํ์"๋ ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ์๋๋๋ค. ์ด๊ฒ์ด ์ด๋ฌํ ๋
ธ๋๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ์
๋๋ค. Append
ะฟัะธ UNION
.
์ฐ๋ฆฌ๋ ๋ํ ๊ทธ๋ฌํ ๋งค๋ญ์ ์ดํดํ๊ณ "ํ ๋๋ฏธ๋ก" ๋ชจ์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.๋ฉ๊ฐํ
์ด๋ธ์์ ์ฝ์ ๋ชจ๋ ๋ด์ฉ์ ์ฌ๊ธฐ ํธ๋ฆฌ ์๋์ ์์ต๋๋ค.".
"๊ฐ๋จํ" ๋ฐ์ดํฐ ์์ ๋ ธ๋
Values Scan
๊ณํ์ ํด๋น VALUES
์์ฒญ์.
Result
์๋ ์์ฒญ์
๋๋ค FROM
~์ฒ๋ผ SELECT 1
. ํน์ ์๋์ ์ผ๋ก ๊ฑฐ์ง ํํ์ ํ์ ๋ WHERE
-block(๊ทธ๋ฌ๋ฉด ์์ฑ์ด ๋ํ๋ฉ๋๋ค. One-Time Filter
):
EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- ะธะปะธ 0 = 1
Result (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
One-Time Filter: false
Function Scan
๋์ผํ ์ด๋ฆ์ SRF์ "๋งคํ"ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ฒฉ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ ๋ณต์กํด์ง๋๋ค. ๋ถํํ๊ฒ๋ ์ฟผ๋ฆฌ๊ฐ ํญ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋์ง๋ ์์ต๋๋ค. InitPlan
/SubPlan
. ๋๋๋ก ๊ทธ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํฉ๋๋ค. ... Join
๋๋ ... Anti Join
, ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ธ ๋ WHERE NOT EXISTS ...
. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๊ทธ๊ฒ๋ค์ ๊ฒฐํฉํ๋ ๊ฒ์ด ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๋ค. ๊ณํ์ ํ
์คํธ์๋ ๊ณํ์ ๋
ธ๋์ ํด๋นํ๋ ์ฐ์ฐ์๊ฐ ์์ต๋๋ค.
๋ค์ "๋ณํ๊ฐ ์๋" ์์
: ์ผ๋ถ VALUES
์์ฒญ์. ์ด ๊ฒฝ์ฐ์ ๊ณํ์์๋ ์ฌ๋ฌ ๋
ธ๋๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค. Values Scan
.
"๋ฒํธ๊ฐ ๋งค๊ฒจ์ง" ์ ๋ฏธ์ฌ๋ ์๋ก ๊ตฌ๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ํด๋น ์ ๋ฏธ์ฌ๋ ํด๋น ์ ๋ฏธ์ฌ๊ฐ ๋ฐ๊ฒฌ๋ ์์๋๋ก ์ ํํ๊ฒ ์ถ๊ฐ๋ฉ๋๋ค. VALUES
-์์ฒญ์ ์์์ ์๋๋ก ์ฐจ๋จํฉ๋๋ค.
๋ฐ์ดํฐ ์ฒ๋ฆฌ
์์ฒญ ๋ด์ฉ์ด ๋ชจ๋ ์ ๋ฆฌ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋จ์ ๊ฒ์ Limit
.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค. Limit
, Sort
, Aggregate
, WindowAgg
, Unique
์์ฒญ์ ํด๋น ์ฐ์ฐ์(์๋ ๊ฒฝ์ฐ)์ ์ผ๋์ผ๋ก "๋งคํ"ํฉ๋๋ค. ์ฌ๊ธฐ์๋ "๋ณ"์ด๋ ์ด๋ ค์์ด ์์ต๋๋ค.
JOIN
๊ฒฐํฉํ๊ณ ์ถ์ ๋ ์ด๋ ค์์ด ๋ฐ์ํฉ๋๋ค JOIN
๊ทธ๋ค ์ฌ์ด. ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ฟผ๋ฆฌ ํ์์ ๊ด์ ์์ ๋ณด๋ฉด ๋
ธ๋๊ฐ ์์ต๋๋ค. JoinExpr
, ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ ํํ ๋ ๋ช
์ ์์์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ JOIN "์"์ ์๋ ๋ด์ฉ์ด๋ฉฐ ์์ฒญ์์ JOIN "์๋"์ ์์ฑ๋ ๋ด์ฉ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณํ์ ๊ด์ ์์ ๋ณผ ๋ ์ด๋ค์ ์ผ๋ถ์ ํ์์
๋๋ค. * Loop
/* Join
-๋ง๋. Nested Loop
, Hash Anti Join
,... - ๊ทธ๋ฐ ๊ฑฐ์.
๊ฐ๋จํ ๋
ผ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๊ณํ์์ ์๋ก "๊ฒฐํฉ"ํ๋ ํ
์ด๋ธ A์ B๊ฐ ์๋ ๊ฒฝ์ฐ ์์ฒญ์์ ํด๋น ํ
์ด๋ธ์ ์ฐพ์ ์ ์์ต๋๋ค. A-JOIN-B
๋๋ B-JOIN-A
. ์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฐํฉํ๊ณ , ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฐํฉํ๋ ์์ผ๋ก ์ด๋ฌํ ์์ด ๋ถ์กฑํ ๋๊น์ง ๊ณ์ํฉ๋๋ค.
๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ ๊ณํ์ ์ธ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ ์ฌํ์ง ์์ต๋๋ค!
๊ทธ๋ํ ํํ๋ก ๋ค์ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค. ์, ๋ฒ์จ ๋ญ๊ฐ ๋ณด์ด๋๊ตฐ์!
์์ B์ C๋ฅผ ๋์์ ๊ฐ๋ ๋
ธ๋๊ฐ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ์ด๋ค ์์์ธ์ง๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ฒฐํฉํ๊ณ ๋
ธ๋์ ๊ทธ๋ฆผ์ ๋ค์ง์ด ๋ด
์๋ค.
๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์์ A์ ์ (B + C)์ ๊ฐ์ง ๋
ธ๋๋ฅผ ๊ฐ๊ฒ ๋์์ต๋๋ค. ์ด๋ค๊ณผ๋ ํธํ๋ฉ๋๋ค.
์์ฒญ๋! ์๊ณ ๋ณด๋ ์ฐ๋ฆฌ ๋์ด๋ค JOIN
๊ณํ ๋
ธ๋์์ ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ๊ฒฐํฉ๋์์ต๋๋ค.
์์ฝ๊ฒ๋ ์ด ๋ฌธ์ ๊ฐ ํญ์ ํด๊ฒฐ๋๋ ๊ฒ์ ์๋๋๋ค.
์๋ฅผ ๋ค์ด ์์ฒญ์ ์๋ ๊ฒฝ์ฐ A JOIN B JOIN C
, ๊ทธ๋ฆฌ๊ณ ๊ณํ์์๋ ์ฐ์ "์ธ๋ถ" ๋
ธ๋ A์ C๊ฐ ์ฐ๊ฒฐ๋์์ง๋ง ์์ฒญ์๋ ๊ทธ๋ฌํ ์ฐ์ฐ์๊ฐ ์์ผ๋ฉฐ ๊ฐ์กฐํ ๊ฒ๋ ์๊ณ ํํธ๋ฅผ ์ฒจ๋ถํ ๊ฒ๋ ์์ต๋๋ค. ์ธ ๋ "์ผํ"๋ ๋ง์ฐฌ๊ฐ์ง์์ A, B
.
๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ชจ๋ ๋
ธ๋๋ "์ฐ๊ฒฐ ํด์ "๋ ์ ์์ผ๋ฉฐ JavaScript ์ฝ๋๋ฅผ ๋ถ์ํ ๋ Google Chrome์์์ ๊ฐ์ด ๋ฌธ์ ๊ทธ๋๋ก ์ผ์ชฝ์์ ์ด๋ฌํ ์ข
๋ฅ์ ํ๋กํ์ผ๋ง์ ์ป์ ์ ์์ต๋๋ค. ๊ฐ ์ค๊ณผ ๊ฐ ๋ฌธ์ด "์คํ"๋๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ์ ๋์ฑ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ์ค ์ ์๋๋ก ์๋ฉ๊ณต๊ฐ์ ๋ง๋ จํด๋์์ต๋๋ค.
์ฝ์ ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ ํ ํ์์ผ๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ธ์.
์ถ์ฒ : habr.com