Exists ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ (SQL)

2024. 2. 12. 22:07ใ†Database/DB ์Šคํ„ฐ๋””

๊ฐœ์ธ์ ์œผ๋กœ SQL์˜ Exists ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ๋‚ฎ์•˜๊ณ  ์ด๋กœ ์ธํ•ด ์‹ค์ œ๋กœ ํ™œ์šฉ์„ ๊ฑฐ์˜ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, DB ์Šคํ„ฐ๋””๋ฅผ ์œ„ํ•ด ์ฑ…์„ ์ฝ๋Š” ๋„์ค‘ ํ•ด๋‹น ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋“ฑ์žฅํ•ด์„œ ์ด ๊ธฐํšŒ์— ์ด๋ฅผ ํ™•์‹คํžˆ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ณ ์ž ํ•œ๋‹ค.

 

Exists ์—ฐ์‚ฐ์ž๋ž€?

Exists ์—ฐ์‚ฐ์ž๋Š” ์—ฐ์‚ฐ์ž ์ดํ›„์— ๋“ฑ์žฅํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ True, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋ง๋กœ๋งŒ ์„ค๋ช…ํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์–ด๋ ค์šฐ๋‹ˆ ์‹ค์ œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SELECT post.id, post.name
FROM post
WHERE post.user_id = 10 AND EXISTS (
    SELECT 1
    FROM comment
    WHERE comment.post_id = post.id AND comment.created_at >= '2023-08-01'
);

์œ„ ์˜ˆ์‹œ๋Š” 2023-10-01 ์ผ์ž ์ดํ›„์— ์ƒ์„ฑ๋œ ๋Œ“๊ธ€์„ ํ•˜๋‚˜๋ผ๋„ ๊ฐ€์ง€๋ฉด์„œ, ๋™์‹œ์— user_id ๊ฐ’์ด 10์ธ post์˜ ์‹๋ณ„์ž๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋Š” ์ฟผ๋ฆฌ๋กœ, ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ EXISTS ์—ฐ์‚ฐ์ž๊ฐ€ True๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜๊ฒŒ ๋œ๋‹ค.

 

์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”์ง€

์œ„์—์„œ ์˜ˆ์‹œ๋กœ ๋“  ์ฟผ๋ฆฌ๋Š” ์‚ฌ์‹ค ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ•œ๋‹ค.

SELECT DISTINCT p.id, p.name
FROM post p, comment c
WHERE p.user_id = 10 AND p.id = c.post_id AND c.created_at >= '2023-08-01';

 

์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ Exists ์ฟผ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„ ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ตณ์ด Exists ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ญ˜๊นŒ?

๊ทธ ์ด์œ ๋Š” ๋ฐ”๋กœ, ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜๋ผ๋„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ทธ ์ฆ‰์‹œ ์ดํ›„์˜ ๋ถˆํ•„์š”ํ•œ ๊ฒ€์ƒ‰์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•˜๋ฉด ๊ตณ์ด ์ฝ์„ ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ณ  ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ ๋‹ค์‹œ ๊ฐ€์ง€์น˜๊ธฐํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น  ํ•„์š”๋„ ์—†์–ด์ง„๋‹ค. 

์ด๋ฅผ ์‹ค์ œ๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ์˜ˆ์‹œ ์ฟผ๋ฆฌ๋“ค์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์‚ดํŽด๋ณด์ž.

์‹คํ–‰ ๊ณ„ํš

Join ์ฟผ๋ฆฌ

JOIN ์ฟผ๋ฆฌ EXPLAIN ๊ฒฐ๊ณผ
JOIN ์ฟผ๋ฆฌ EXPLAIN ANALYZE ๊ฒฐ๊ณผ

๋จผ์ € ๋‹จ์ˆœ ์กฐ์ธ ์ฟผ๋ฆฌ์ด๋‹ค.

์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด NL ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•œ ๋’ค์—, ์ฟผ๋ฆฌ ๋‚ด์˜ DISTINCT ์ ˆ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ž„์‹œ ํ…Œ์ด๋ธ”์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋˜๋Š”์ง€ ๋””์Šคํฌ์— ์ƒ์„ฑ๋˜๋Š”์ง€์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ์ƒ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜๋‚˜ ์‹คํ–‰ ๊ณ„ํš ์ƒ์—์„œ ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ ์‹ค์ œ ์†Œ์š” ์‹œ๊ฐ„๋งŒ ๋†“๊ณ  ๋ณด๋ฉด ์ด ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ํ™œ์šฉํ•˜๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ผ์ข…์˜ ๋ณ‘๋ชฉ์œผ๋กœ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

Exists ์ฟผ๋ฆฌ

EXISTS ์ฟผ๋ฆฌ EXPLAIN ๊ฒฐ๊ณผ
EXISTS ์ฟผ๋ฆฌ EXPLAIN ANALYZE ๊ฒฐ๊ณผ

๋‹ค์Œ์€ Exists ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ์ด๋‹ค.

์‹คํ–‰ ๊ณ„ํš ์ƒ์˜ ์„ธ๋ฏธ์กฐ์ธ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋ˆˆ์— ๋ˆ๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋Š” Mysql์—์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์‹ค์ œ ์กฐ์ธ์€ ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ(๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ), ๋‹จ์ง€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ํ˜•ํƒœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ ๋“ฑ์žฅํ•œ๋‹ค. 

๋˜ํ•œ Explain ๊ฒฐ๊ณผ ์ถœ๋ ฅ์˜ Extra ๋ถ€๋ถ„์˜ FirstMatch(post)๋ผ๋Š” ๋‹จ์–ด๋„ ๋ˆˆ์— ๋„๋Š”๋ฐ, ์ด๋Š” post ํ…Œ์ด๋ธ”์—์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•  ๋•Œ(์—ฌ๊ธฐ์—์„œ๋Š” comment ํ…Œ์ด๋ธ”) ์กฐ์ธ์˜ ์ž‘๋™ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌ ์‹œ ๊ณง๋ฐ”๋กœ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์กฐ์ธ์ด ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด๋Š” ์„ธ๋ฏธ์กฐ์ธ ์ตœ์ ํ™” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ, Exists ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ์‹คํ–‰ ๊ณ„ํš ์ƒ์—์„œ ์ œ์–ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ์œ„ ์ฟผ๋ฆฌ๋Š” ์‹คํ–‰ ๊ณ„ํš ์ƒ์—์„œ ๋ณ‘๋ชฉ ์ง€์ ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ ์ฒซ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. 

์ด๋ ‡๊ฒŒ ์ฟผ๋ฆฌ๊ฐ€ ์ž‘์„ฑ๋  ๊ฒฝ์šฐ, ์ดํ›„ ํŽ˜์ด์ง€๋„ค์ด์…˜๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ ๋น„์•ฝ์ ์œผ๋กœ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด OLTP ํ™˜๊ฒฝ์˜ ํŠน์„ฑ์— ๋ถ€ํ•ฉํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋œ๋‹ค.