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 ์ฟผ๋ฆฌ
๋จผ์ ๋จ์ ์กฐ์ธ ์ฟผ๋ฆฌ์ด๋ค.
์คํ ๊ณํ์ ๋ณด๋ฉด NL ์กฐ์ธ์ ์ํํ ๋ค์, ์ฟผ๋ฆฌ ๋ด์ DISTINCT ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ ํ ์ด๋ธ์ ํ์ฉํ๊ณ ์๋ค. ์์ ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๋์ง ๋์คํฌ์ ์์ฑ๋๋์ง์ ๋ฐ๋ผ ์ฑ๋ฅ ์ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ ์คํ ๊ณํ ์์์ ์ด๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ค๋ง ์ค์ ์์ ์๊ฐ๋ง ๋๊ณ ๋ณด๋ฉด ์ด ์์ ํ ์ด๋ธ์ ํ์ฉํ๋๋ฐ ๋๋ถ๋ถ์ ์๊ฐ์ด ์์๋๋ ์ํฉ์ด๋ค. ์ผ์ข ์ ๋ณ๋ชฉ์ผ๋ก ์์ฉํ๋ ๊ฒ์ด๋ค.
Exists ์ฟผ๋ฆฌ
๋ค์์ Exists ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ฟผ๋ฆฌ์ด๋ค.
์คํ ๊ณํ ์์ ์ธ๋ฏธ์กฐ์ธ์ด๋ผ๋ ํค์๋๊ฐ ๋์ ๋๋ค. ์ด ํค์๋๋ Mysql์์ ๋ค๋ฅธ ํ ์ด๋ธ์ ์ค์ ์กฐ์ธ์ ํ์ง ์์ผ๋ฉด์(๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ์ง ์์), ๋จ์ง ๋ค๋ฅธ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋์ง ํ์ธ๋ง ์ํํ๋ ํํ์ ์ฟผ๋ฆฌ๊ฐ ์ํ๋ ๋ ๋ฑ์ฅํ๋ค.
๋ํ Explain ๊ฒฐ๊ณผ ์ถ๋ ฅ์ Extra ๋ถ๋ถ์ FirstMatch(post)๋ผ๋ ๋จ์ด๋ ๋์ ๋๋๋ฐ, ์ด๋ post ํ ์ด๋ธ์์ ๋ค๋ฅธ ํ ์ด๋ธ์ ์กฐํํ ๋(์ฌ๊ธฐ์์๋ comment ํ ์ด๋ธ) ์กฐ์ธ์ ์๋ ๋ฐฉ์์ฒ๋ผ ๋์ํ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋์ ๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌ ์ ๊ณง๋ฐ๋ก ๋ค์ ๋ ์ฝ๋์ ๋ํ ์กฐ์ธ์ด ์ํ๋๋ค๋ ์๋ฏธ์ด๋ค. ์ด๋ ์ธ๋ฏธ์กฐ์ธ ์ต์ ํ ๋ฐฉ์ ์ค ํ๋๋ก, Exists ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์ฝ๊ธฐ ์์ ์ ์ํํ์ง ์๋๋ก ์คํ ๊ณํ ์์์ ์ ์ดํ๊ณ ์๋ ๊ฒ์ด๋ค. ์ด๋ก ์ธํด ์ ์ฟผ๋ฆฌ๋ ์คํ ๊ณํ ์์์ ๋ณ๋ชฉ ์ง์ ์ด ์กด์ฌํ์ง ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์ฒซ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋๋ฐ ์์ฃผ ์งง์ ์๊ฐ์ด ์์๋๋ค.
์ด๋ ๊ฒ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ ๊ฒฝ์ฐ, ์ดํ ํ์ด์ง๋ค์ด์ ๊ณผ ๊ฐ์ ๋ถ๋ถ ๋ฒ์ ์ฒ๋ฆฌ๋ฅผ ๋์ ํ์ฌ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋น์ฝ์ ์ผ๋ก ๋จ์ถ์ํฌ ์ ์๊ฒ ๋์ด OLTP ํ๊ฒฝ์ ํน์ฑ์ ๋ถํฉํ๋ ์ฟผ๋ฆฌ๊ฐ ๋๋ค.
'Database > DB ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MVCC in Mysql(with ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค) (0) | 2024.02.25 |
---|---|
์๋ธ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋ํ ์คํด (1) | 2024.01.21 |
SGA vs PGA (in Oracle) (1) | 2024.01.14 |
๋ณตํฉ ์ธ๋ฑ์ค ํ์ฉ ๊ฒฝ์ฐ์ ์ (1) | 2023.12.31 |
๋ฑํธ ์ฐ์ฐ์์ LIKE ์ฐ์ฐ์ ๊ฐ ๋น๊ต (1) | 2023.12.17 |