PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์œ ํ•ดํ•œ JOIN ๋ฐ OR

๋ฒ„ํผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์— ์ฃผ์˜ํ•˜์„ธ์š”...
์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PostgreSQL์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ณดํŽธ์  ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋“  ์•„๋‹ˆ๋“  ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์ง€๋งŒ, ๊ทธ๋“ค์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ํ›„์† ๋ฒ„์ „์˜ PG์—์„œ๋Š” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋” ๋˜‘๋˜‘ํ•ด์ง€๋ฉด ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ 9.4/9.6์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์˜ ์˜ˆ์—์„œ์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๋งค์šฐ ์‹ค์ œ์ ์ธ ์š”์ฒญ์„ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SELECT
  TRUE
FROM
  "ะ”ะพะบัƒะผะตะฝั‚" d
INNER JOIN
  "ะ”ะพะบัƒะผะตะฝั‚ะ ะฐััˆะธั€ะตะฝะธะต" doc_ex
    USING("@ะ”ะพะบัƒะผะตะฝั‚")
INNER JOIN
  "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" t_doc ON
    t_doc."@ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = d."ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
WHERE
  (d."ะ›ะธั†ะพ3" = 19091 or d."ะกะพั‚ั€ัƒะดะฝะธะบ" = 19091) AND
  d."$ะงะตั€ะฝะพะฒะธะบ" IS NULL AND
  d."ะฃะดะฐะปะตะฝ" IS NOT TRUE AND
  doc_ex."ะกะพัั‚ะพัะฝะธะต"[1] IS TRUE AND
  t_doc."ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = 'ะŸะปะฐะฝะ ะฐะฑะพั‚'
LIMIT 1;

ํ…Œ์ด๋ธ” ๋ฐ ํ•„๋“œ ์ด๋ฆ„์— ๋Œ€ํ•ดํ•„๋“œ์™€ ํ…Œ์ด๋ธ”์˜ "๋Ÿฌ์‹œ์•„์–ด" ์ด๋ฆ„์€ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ์ทจํ–ฅ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์—ฌ๊ธฐ ํ…์„œ์—์„œ ์™ธ๊ตญ ๊ฐœ๋ฐœ์ž๋Š” ์—†์œผ๋ฉฐ PostgreSQL์—์„œ๋Š” ์ƒํ˜• ๋ฌธ์ž๋กœ๋„ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค, ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ถˆ์ผ์น˜๊ฐ€ ์—†๋„๋ก ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ ๊ณ„ํš์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์œ ํ•ดํ•œ JOIN ๋ฐ OR
[explain.tensor.ru ์ฐธ์กฐ]

144ms ๋ฐ ๊ฑฐ์˜ 53K ๋ฒ„ํผ - ์ฆ‰, 400MB ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์š”์ฒญ ์‹œ์ ์— ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์บ์‹œ์— ์žˆ์œผ๋ฉด ์šด์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋””์Šคํฌ์—์„œ ์ฝ์„ ๋•Œ ์‹œ๊ฐ„์ด ๋ช‡ ๋ฐฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ๋“  ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์ฒญ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ ์ž์ฒด์˜ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด์„œ๋Š” ์ง€๊ธˆ์€ ์ด ๊ธฐ์‚ฌ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์„œ ์ƒ๋Œ€์ ์œผ๋กœ "์ €๋ ดํ•˜๊ฒŒ" ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋™์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์„ ๋‹ค์‹œ ์ž‘์„ฑ ๊ทธ๋ฆฌ๊ณ /๋˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋ฐ”๋‹ฅ์— ๊ตด๋ ค ๋†“์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ์ƒ‰์ธ.

๋”ฐ๋ผ์„œ ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
โ€” ์ ์–ด๋„ ์ผ๋ถ€ ๋ฌธ์„œ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ํŠน์ • ์œ ํ˜•์˜ ์กฐ๊ฑด์—์„œ
- ์ €์ž๋‚˜ ์ˆ˜ํ–‰์ž๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ์ง์›์ธ ๊ฒฝ์šฐ

๊ฐ€์ž… + ์ œํ•œ 1

๋งŽ์€ ์ˆ˜์˜ ํ…Œ์ด๋ธ”์ด ์ฒ˜์Œ ์กฐ์ธ๋œ ๋‹ค์Œ ์ „์ฒด ์„ธํŠธ์—์„œ ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ๋‚จ๊ฒŒ ๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ์‰ฝ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋” ํšจ์œจ์ ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ํ…Œ์ด๋ธ”์ด 3๊ฐœ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํšจ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋จผ์ € "Document Type" ํ…Œ์ด๋ธ”๊ณผ์˜ ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‹ค์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์œ ํ˜• ๋ ˆ์ฝ”๋“œ๋Š” ๋…ํŠนํ•ฉ๋‹ˆ๋‹ค (์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์•„์ง ๋ชจ๋ฆ…๋‹ˆ๋‹ค):

WITH T AS (
  SELECT
    "@ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
  FROM
    "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
  WHERE
    "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = 'ะŸะปะฐะฝะ ะฐะฑะพั‚'
  LIMIT 1
)
...
WHERE
  d."ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = (TABLE T)
...

์˜ˆ, ํ…Œ์ด๋ธ”/CTE๊ฐ€ ๋‹จ์ผ ๋ ˆ์ฝ”๋“œ์˜ ๋‹จ์ผ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ PG์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

d."ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = (SELECT "@ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" FROM T LIMIT 1)

PostgreSQL ์ฟผ๋ฆฌ์˜ ์ง€์—ฐ ํ‰๊ฐ€

๋น„ํŠธ๋งต๋˜๋Š” UNION

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋น„ํŠธ๋งต ํž™ ์Šค์บ”์— ๋งŽ์€ ๋น„์šฉ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฝค ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•„์ˆ˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค ์™œ๋ƒํ•˜๋ฉด OR ์กฐ๊ฑด์ด BitmapOr๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.- ๊ณ„ํš๋Œ€๋กœ ์šด์˜ ์ค‘.
์›๋ž˜ ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์— ํ•ด๋‹นํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ๋ˆ„๊ตฌ์—๊ฒŒ ์ฆ‰, ๋‘ ์กฐ๊ฑด ๋ชจ๋‘์—์„œ 59K ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ, ์ฒซ ๋ฒˆ์งธ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋งŒ ๋‘ ๋ฒˆ์งธ๋กœ ์ด๋™. ๋‹ค์Œ ๋””์ž์ธ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(
  SELECT
    ...
  LIMIT 1
)
UNION ALL
(
  SELECT
    ...
  LIMIT 1
)
LIMIT 1

"์™ธ๋ถ€" LIMIT 1์€ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ฒ€์ƒ‰์ด ์ข…๋ฃŒ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก์—์„œ ์ด๋ฏธ ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ•œ๋ฒˆ๋„ ์ฒ˜ํ˜•๋œ ์ ์ด ์—†๋‹ค ์— ๊ด€ํ•˜์—ฌ).

"์‚ฌ๊ฑด์—์„œ ์–ด๋ ค์šด ์กฐ๊ฑด์„ ์ˆจ๊ธฐ๊ธฐ"

์›๋ž˜ ์ฟผ๋ฆฌ์—๋Š” ๊ด€๋ จ ํ…Œ์ด๋ธ” "DocumentExtension"์— ๋Œ€ํ•ด ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋งค์šฐ ๋ถˆํŽธํ•œ ์ˆœ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œํ˜„์˜ ๋‹ค๋ฅธ ์กฐ๊ฑด์ด ์ฐธ์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด(์˜ˆ: d.โ€œ์‚ญ์ œโ€๋Š” ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.), ์ด ์—ฐ๊ฒฐ์€ ํ•ญ์ƒ ์‹คํ–‰๋˜๋ฉฐ "๋ฆฌ์†Œ์Šค ๋น„์šฉ์ด ๋ฐœ์ƒ"ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์–ด๋Š ์ •๋„๋Š” ์†Œ๋น„๋ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ จ ๋ ˆ์ฝ”๋“œ ๊ฒ€์ƒ‰์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT
  ...
FROM
  "ะ”ะพะบัƒะผะตะฝั‚" d
WHERE
  ... /*index cond*/ AND
  CASE
    WHEN "$ะงะตั€ะฝะพะฒะธะบ" IS NULL AND "ะฃะดะฐะปะตะฝ" IS NOT TRUE THEN (
      SELECT
        "ะกะพัั‚ะพัะฝะธะต"[1] IS TRUE
      FROM
        "ะ”ะพะบัƒะผะตะฝั‚ะ ะฐััˆะธั€ะตะฝะธะต"
      WHERE
        "@ะ”ะพะบัƒะผะตะฝั‚" = d."@ะ”ะพะบัƒะผะตะฝั‚"
    )
  END

๋งํฌ ๋œ ํ…Œ์ด๋ธ”์—์„œ ์šฐ๋ฆฌ์—๊ฒŒ ํ•œ ๋ฒˆ ๊ฒฐ๊ณผ์—๋Š” ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค., ๊ทธ๋Ÿฐ ๋‹ค์Œ JOIN์„ ํ•˜์œ„ ์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ธ๋ฑ์Šค ๋œ ํ•„๋“œ๋ฅผ "์ผ€์ด์Šค ๋ธŒ๋ž˜ํ‚ท ์™ธ๋ถ€"๋กœ๋‘๊ณ  ๋ ˆ์ฝ”๋“œ์—์„œ when ๋ธ”๋ก์œผ๋กœ ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ "๋ฌด๊ฑฐ์šด"์ฟผ๋ฆฌ๋Š” ํ†ต๊ณผ ํ•  ๋•Œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์„ฑ์€ "ํ† ํƒˆ"์ด์—์š”

๊ฒฐ๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋“  ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

WITH T AS (
  SELECT
    "@ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
  FROM
    "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ"
  WHERE
    "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ" = 'ะŸะปะฐะฝะ ะฐะฑะพั‚'
)
  (
    SELECT
      TRUE
    FROM
      "ะ”ะพะบัƒะผะตะฝั‚" d
    WHERE
      ("ะ›ะธั†ะพ3", "ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ") = (19091, (TABLE T)) AND
      CASE
        WHEN "$ะงะตั€ะฝะพะฒะธะบ" IS NULL AND "ะฃะดะฐะปะตะฝ" IS NOT TRUE THEN (
          SELECT
            "ะกะพัั‚ะพัะฝะธะต"[1] IS TRUE
          FROM
            "ะ”ะพะบัƒะผะตะฝั‚ะ ะฐััˆะธั€ะตะฝะธะต"
          WHERE
            "@ะ”ะพะบัƒะผะตะฝั‚" = d."@ะ”ะพะบัƒะผะตะฝั‚"
        )
      END
    LIMIT 1
  )
UNION ALL
  (
    SELECT
      TRUE
    FROM
      "ะ”ะพะบัƒะผะตะฝั‚" d
    WHERE
      ("ะขะธะฟะ”ะพะบัƒะผะตะฝั‚ะฐ", "ะกะพั‚ั€ัƒะดะฝะธะบ") = ((TABLE T), 19091) AND
      CASE
        WHEN "$ะงะตั€ะฝะพะฒะธะบ" IS NULL AND "ะฃะดะฐะปะตะฝ" IS NOT TRUE THEN (
          SELECT
            "ะกะพัั‚ะพัะฝะธะต"[1] IS TRUE
          FROM
            "ะ”ะพะบัƒะผะตะฝั‚ะ ะฐััˆะธั€ะตะฝะธะต"
          WHERE
            "@ะ”ะพะบัƒะผะตะฝั‚" = d."@ะ”ะพะบัƒะผะตะฝั‚"
        )
      END
    LIMIT 1
  )
LIMIT 1;

[to] ์ธ๋ฑ์Šค ์กฐ์ •

ํ›ˆ๋ จ๋œ ๋ˆˆ์€ UNION ํ•˜์œ„ ๋ธ”๋ก์˜ ์ธ๋ฑ์Šค ์กฐ๊ฑด์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ ํ…Œ์ด๋ธ”์— ์ ํ•ฉํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋งŒ๋“ค์–ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋ฌธ์„œ(Person3, ๋ฌธ์„œ ์œ ํ˜•) ะธ ๋ฌธ์„œ(๋ฌธ์„œ ์œ ํ˜•, ์ง์›).
ํ–‰ ์กฐ๊ฑด์—์„œ ํ•„๋“œ์˜ ์ˆœ์„œ์— ๋Œ€ํ•ด๊ธฐํš์ž ์ž…์žฅ์—์„œ๋Š” ๋ฌผ๋ก  ์“ธ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ (A, B) = (constA, constB)๊ณผ (B, A) = (constB, constA). ํ•˜์ง€๋งŒ ๋…น์Œํ•  ๋•Œ ์ธ๋ฑ์Šค์˜ ํ•„๋“œ ์ˆœ์„œ๋Œ€๋กœ, ์ด๋Ÿฌํ•œ ์š”์ฒญ์€ ๋‚˜์ค‘์— ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๊ณ„ํš์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?
PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์œ ํ•ดํ•œ JOIN ๋ฐ OR
[explain.tensor.ru ์ฐธ์กฐ]

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” ์šด์ด ์ข‹์ง€ ์•Š์•˜๊ณ  ์ฒซ ๋ฒˆ์งธ UNION ๋ธ”๋ก์—์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ์งธ UNION ๋ธ”๋ก์ด ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  - ๋‹จ์ง€ 0.037ms ๋ฐ 11๊ฐœ ๋ฒ„ํผ!
์š”์ฒญ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ํŽŒํ•‘์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๋ฒˆ, ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ๊ฐ„์˜ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ๋กœ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€