๋ณด๋ค ์์ฐ์ ์ธ ์๋ฒ๋ก ์ด๋ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฟผ๋ฆฌ ์๋ฅผ 10๋ฐฐ ๋๋ฆฌ๊ณ ์์คํ
๊ธฐ๋ฅ์ ์ ์งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง, ์ปดํจํ
๋ฆฌ์์ค ๋น์ฉ์ ๋๋ฆฌ์ง ์๊ณ ์ต๋ํ ๋ง์ ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด SQL ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ ๋ฐฉ๋ฒ์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ๋ ๊ฑด์คํ์ฌ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๋ ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค. ์ฝ 3๊ฐ ํ์ฌ๊ฐ ์ฐ๋ฆฌ์ ํ๋ ฅํ๊ณ ์์ต๋๋ค. 10๋ช
์ด ๋๋ ์ฌ๋๋ค์ด ๋งค์ผ 4~10์๊ฐ ๋์ ์ฐ๋ฆฌ ์์คํ
์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ณํ, ์๋ฆผ, ๊ฒฝ๊ณ , ๊ฒ์ฆ ๋ฑ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ PostgreSQL 9.6์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ฝ 300๊ฐ์ ํ
์ด๋ธ์ด ์์ผ๋ฉฐ ๋งค์ผ ์ต๋ 200์ต ๊ฐ์ ์ฟผ๋ฆฌ(10๊ฐ์ ๋ค๋ฅธ ์ฟผ๋ฆฌ)๊ฐ ์์ ๋ฉ๋๋ค. ํ๊ท ์ ์ผ๋ก ์ด๋น 3~4๊ฐ์ ์์ฒญ์ด ์์ผ๋ฉฐ, ๊ฐ์ฅ ํ๋์ ์ธ ์๊ฐ์๋ ์ด๋น 10๊ฐ ์ด์์ ์์ฒญ์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฟผ๋ฆฌ๋ OLAP์
๋๋ค. ์ถ๊ฐ, ์์ ๋ฐ ์ญ์ ๊ฐ ํจ์ฌ ์ ์ผ๋ฏ๋ก OLTP ๋ก๋๊ฐ ์๋์ ์ผ๋ก ์ ์ต๋๋ค. ์ ๋ ๊ทํ๊ฐ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๊ท๋ชจ๋ฅผ ํ๊ฐํ๊ณ ์ฐ๋ฆฌ ๊ฒฝํ์ด ๊ทํ์๊ฒ ์ผ๋ง๋ ์ ์ฉํ์ง ์ดํดํ ์ ์๋๋ก ์ด ๋ชจ๋ ์์น๋ฅผ ์ ๊ณตํ์ต๋๋ค.
๊ทธ๋ฆผ 1. ์์ ์
์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ์ ์์ํ์ ๋, ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ค ์ข
๋ฅ์ ๋ถํ๊ฐ ๊ฑธ๋ฆด์ง, ์๋ฒ๊ฐ ํ๋ง์ ์ค๋จํ๋ฉด ์ด๋ป๊ฒ ํ ์ง์ ๋ํด ์ค์ ๋ก ์๊ฐํ์ง ์์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๊ณํ ๋ ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ฅด๊ณ ๋ฐ์ ์ด์ ์์ง ์์ผ๋ ค๊ณ ๋
ธ๋ ฅํ์ง๋ง "ํจํด์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค"์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์กฐ์ธ์ ๋์ด์ฐ์ต๋๋ค.
๊ทธ๋ฆผ 2. ํต๊ณ
๋ฐ๋ผ์ ์ฐ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ํ๋ฃจ์ ์ฝ 10๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค. ์ด 10๋ง๊ฐ ์ค์ ํ๊ท ์คํ ์๊ฐ์ด 2~3ms๋ก 0.1~0.3๋ง ๋ฒ ์คํ๋๋ ๋ชฌ์คํฐ๊ฐ ์๊ณ , ํ๋ฃจ์ 30๋ฒ ํธ์ถ๋๋ ํ๊ท ์คํ ์๊ฐ์ด 100์ด์ธ ์ฟผ๋ฆฌ๋ ์๋ค.
10๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์ต์ ํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ํฅ์์ํค๊ธฐ ์ํด ๋ ธ๋ ฅ์ ์ด๋๋ก ๊ธฐ์ธ์ฌ์ผ ํ ์ง ํ์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ฌ๋ฌ ๋ฒ์ ๋ฐ๋ณต ํ์ ์ฐ๋ฆฌ๋ ์์ฒญ์ ์ ํ์ผ๋ก ๋๋๊ธฐ ์์ํ์ต๋๋ค.
TOP ์์ฒญ
์ด๋ ๊ฐ์ฅ ๋ง์ ์๊ฐ(์ด ์๊ฐ)์ด ์์๋๋ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ์ ๋๋ค. ์ด๋ ๋งค์ฐ ์์ฃผ ํธ์ถ๋๋ ์ฟผ๋ฆฌ์ด๊ฑฐ๋ ์คํํ๋ ๋ฐ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ์ ๋๋ค(๊ธธ๊ณ ๋น๋ฒํ ์ฟผ๋ฆฌ๋ ์๋๋ฅผ ์ํ ์ธ์์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์์ ์ต์ ํ๋์์ต๋๋ค). ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ฒ๋ ์คํ์ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ์๋นํฉ๋๋ค. ๋ํ ์์ ์์ฒญ์ ์ด ์คํ ์๊ฐ๋ณ๋ก ๋ถ๋ฆฌํ๊ณ IO ์๊ฐ๋ณ๋ก ๋ณ๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฌํ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค.
๋ชจ๋ ํ์ฌ์ ์ผ๋ฐ์ ์ธ ๊ดํ์ TOP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ์ฟผ๋ฆฌ ํ๋๋ง ์ต์ ํํด๋ 5~10%์ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ ํธ๊ฐ ์ฑ์ํด์ง์ ๋ฐ๋ผ TOP ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ๋ชจ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ํด๊ฒฐ๋์์ผ๋ฉฐ ๊ฐ์ฅ "๋ฌด๊ฑฐ์ด" ์์ฒญ์๋ ๋ฆฌ์์ค์ "๋จ์ง" 3-5%๋ง ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ฒด TOP ์ฟผ๋ฆฌ์ ์์๋๋ ์๊ฐ์ด 30~40% ๋ฏธ๋ง์ด๋ผ๋ฉด ํด๋น ์ฟผ๋ฆฌ๊ฐ ๋น ๋ฅด๊ฒ ์๋ํ๋๋ก ์ด๋ฏธ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ด์ ๋ค์ ๊ทธ๋ฃน์ ์ฟผ๋ฆฌ ์ต์ ํ๋ก ๋์ด๊ฐ ๋์
๋๋ค.
์ด ๊ทธ๋ฃน์ ์ผ๋ง๋ ๋ง์ ์์ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํด์ผ ํ๋์ง์ ๋ํ ์ง๋ฌธ์ ๋ตํ๋ ๊ฒ์ด ๋จ์ ์์ต๋๋ค. ์ ๋ ๋ณดํต ์ต์ 10๊ฐ, ์ต๋ 20๊ฐ๋ฅผ ๋ฐ์ต๋๋ค. TOP ๊ทธ๋ฃน์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง์ ์๊ฐ์ด 10๋ฐฐ ์ด์ ์ฐจ์ด๊ฐ ๋์ง ์๋๋ก ๋
ธ๋ ฅํฉ๋๋ค. ์ฆ, ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ด 1์์์ 10์๋ก ๊ธ๊ฒฉํ๊ฒ ๊ฐ์ํ๋ฉด TOP-10์ ์ ํํ๊ณ , ๊ฐ์๊ฐ ์ ์ง์ ์ด๋ผ๋ฉด ๊ทธ๋ฃน ํฌ๊ธฐ๋ฅผ 15 ๋๋ 20์ผ๋ก ๋๋ฆฝ๋๋ค.
์ค๋
์ด๋ ๋ง์ง๋ง 5~10%๋ฅผ ์ ์ธํ๊ณ TOP ๋ฐ๋ก ๋ค์ ์ค๋ ๋ชจ๋ ์์ฒญ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ฉด ์๋ฒ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ฒญ์ ๋น์ค์ ์ต๋ 80%์ ๋ฌํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ ์ ์จ์ด 50%๋ฅผ ๋์ด์ฐ๋ค๊ณ ํด๋ ์ข ๋ ์ฃผ์ ๊น๊ฒ ์ดํด๋ด์ผ ํ ๋๋ค.
๊ผฌ๋ฆฌ
์ธ๊ธํ ๋๋ก ์ด๋ฌํ ์ฟผ๋ฆฌ๋ ๋ง์ง๋ง์ ์ ๊ณต๋๋ฉฐ ์๊ฐ์ 5~10%๊ฐ ์์๋ฉ๋๋ค. ์๋ ์ฟผ๋ฆฌ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ์์ด๋ฒ๋ฆด ์ ์์ผ๋ฉฐ ์ต์ ํํ๋ ๊ฒ๋ ์ ๋ ดํ ์ ์์ต๋๋ค.
๊ฐ ๊ทธ๋ฃน์ ์ด๋ป๊ฒ ํ๊ฐํ๋์?
PostgreSQL์ ๋ํ ํ๊ฐ๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค(๋ค๋ฅธ ๋ง์ DBMS์๋ ์ ์ฌํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค).
TOP-MEDIUM-TAIL ๊ทธ๋ฃน์ ํฌ๊ธฐ๋ฅผ ์ถ์ ํ๋ SQL ์ฟผ๋ฆฌ
SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_tail) AS sum_tail
FROM
(
SELECT CASE WHEN rn <= 20 THEN tt_percent ELSE 0 END AS time_top,
CASE WHEN rn > 20 AND rn <= 800 THEN tt_percent ELSE 0 END AS time_medium,
CASE WHEN rn > 800 THEN tt_percent ELSE 0 END AS time_tail
FROM (
SELECT total_time / (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query,
ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn
FROM pg_stat_statements
ORDER BY total_time DESC
) AS t
)
AS ts
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ์ธ ๊ฐ์ ์ด๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ ์ด์๋ ์ด ๊ทธ๋ฃน์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ฐฑ๋ถ์จ์ด ํฌํจ๋ฉ๋๋ค. ์์ฒญ ์์๋ ํ ๊ทธ๋ฃน์ ์์ฒญ์ ๋ค๋ฅธ ๊ทธ๋ฃน์ ์์ฒญ๊ณผ ๊ตฌ๋ถํ๋ ๋ ๊ฐ์ ์ซ์(์ ๊ฒฝ์ฐ์๋ 20๊ณผ 800)๊ฐ ์์ต๋๋ค.
์ต์ ํ ์์ ์ด ์์๋ ์์ ๊ณผ ํ์ฌ์ ์์ฒญ ๋น์จ์ ๋๋ต์ ์ผ๋ก ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ค์ด์ด๊ทธ๋จ์ TOP ์์ฒญ์ ๋น์จ์ด ๊ธ๊ฒฉํ ๊ฐ์ํ์ง๋ง "์ค๊ฐ ๋๋ฏผ"์ด ์ฆ๊ฐํ์์ ๋ณด์ฌ์ค๋๋ค.
์ฒ์์ TOP ์์ฒญ์๋ ๋
ธ๊ณจ์ ์ธ ์ค์๊ฐ ํฌํจ๋์์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์์ ์งํ์ด ์ฌ๋ผ์ง๊ณ TOP ์์ฒญ ๋น์จ์ด ๊ฐ์ํ์ผ๋ฉฐ ์ด๋ ค์ด ์์ฒญ์ ๊ฐ์ํํ๊ธฐ ์ํด ์ ์ ๋ ๋ง์ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผ ํ์ต๋๋ค.
์์ฒญ ํ ์คํธ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์ ์์ฒญ์ ์ฌ์ฉํฉ๋๋ค.
SELECT * FROM (
SELECT ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn, total_time / (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query
FROM pg_stat_statements
ORDER BY total_time DESC
) AS T
WHERE
rn <= 20 -- TOP
-- rn > 20 AND rn <= 800 -- MEDIUM
-- rn > 800 -- TAIL
TOP ์ฟผ๋ฆฌ ์๋๋ฅผ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ์ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์คํ ์ฌ์ค๊ณ(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ๊ธฐ์ ์ธ ์ฟผ๋ฆฌ ๋์ ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆผ ๋ ผ๋ฆฌ ์ฌ์์ )
- ์์ธ ์ถ๊ฐ ๋๋ ๋ณ๊ฒฝ
- ORM ์ฟผ๋ฆฌ๋ฅผ ์์ SQL๋ก ๋ค์ ์์ฑ
- ์ง์ฐ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ก์ง ์ฌ์์ฑ
- ๋ฐ์ดํฐ ๋น์ ๊ทํ๋ฅผ ํตํ ์บ์ฑ. ์๋ฅผ ๋ค์ด ๋ฐฐ๋ฌ -> ์ก์ฅ -> ์์ฒญ -> ์ ์ฒญ์ด๋ผ๋ ํ ์ด๋ธ ์ฐ๊ฒฐ์ด ์์ต๋๋ค. ์ฆ, ๊ฐ ์ ๋ฌ์ ๋ค๋ฅธ ํ ์ด๋ธ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ฐ ์์ฒญ์ ๋ชจ๋ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ง ์๊ธฐ ์ํด Delivery ํ ์ด๋ธ์ ์์ฒญ์ ๋ํ ๋งํฌ๋ฅผ ๋ณต์ ํ์ต๋๋ค.
- ์ฐธ๊ณ ์์ ์ด ํฌํจ๋ ์ ์ ํ ์ด๋ธ์ ์บ์ฑํ๊ณ ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ์์ ํ ์ด๋ธ์ ๊ฑฐ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
๋๋๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ธ์์ ์ธ ์ฌ์ค๊ณ์ ๋ฌํ์ง๋ง ์์คํ ๋ถํ์ 5-10%๋ฅผ ์ ๊ณตํ์ผ๋ฉฐ ์ ๋นํ์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฐฐ๊ธฐ ์ฅ์น๋ ์ ์ ๋ ์์์ก๊ณ ์ ์ ๋ ์ฌ๊ฐํ ์ฌ์ค๊ณ๊ฐ ํ์ํ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ๋ ๋ฒ์งธ ์์ฒญ ๊ทธ๋ฃน์ธ ์ค๋ ๊ทธ๋ฃน์ ๊ด์ฌ์ ๋๋ ธ์ต๋๋ค. ๊ทธ ์์ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ง์์ง๊ณ ๊ทธ๋ฃน ์ ์ฒด๋ฅผ ๋ถ์ํ๋ ค๋ฉด ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ๊ฒ ๊ฐ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ์ฟผ๋ฆฌ๋ ์ต์ ํํ๊ธฐ๊ฐ ๋งค์ฐ ๊ฐ๋จํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ผ๋ฉฐ ๋ง์ ๋ฌธ์ ๊ฐ ๋ค์ํ ๋ณํ์ผ๋ก ์์ญ ๋ฒ ๋ฐ๋ณต๋์์ต๋๋ค. ๋ค์์ ์์ญ ๊ฐ์ ์ ์ฌํ ์ฟผ๋ฆฌ์ ์ ์ฉํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ต์ ํ์ ์์ด๋ฉฐ, ์ต์ ํ๋ ์ฟผ๋ฆฌ์ ๊ฐ ๊ทธ๋ฃน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ 3~5% ์ธ๋ก๋ํ์ต๋๋ค.
- COUNT์ Full Table Scan์ผ๋ก ๋ ์ฝ๋ ์ ๋ฌด๋ฅผ ํ์ธํ๋ ๋์ EXISTS๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค.
- DISTINCT๋ฅผ ์ ๊ฑฐํ์ต๋๋ค(์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์์ง๋ง ์์ฒญ ์๋๋ฅผ 10~100๋ฐฐ ๋์ฌ ์ฝ๊ฒ ์ ๊ฑฐํ ์ ์์).
์๋ฅผ ๋ค์ด, ํฐ ๋ฐฐ๋ฌ ํ ์ด๋ธ์์ ๋ชจ๋ ์ด์ ์๋ฅผ ์ ํํ๋ ์ฟผ๋ฆฌ ๋์ (DELIVERY)
SELECT DISTINCT P.ID, P.FIRST_NAME, P.LAST_NAME FROM DELIVERY D JOIN PERSON P ON D.DRIVER_ID = P.ID
์๋์ ์ผ๋ก ์์ ํ ์ด๋ธ PERSON์ ๋ํด ์ฟผ๋ฆฌ๋ฅผ ์ํํ์ต๋๋ค.
SELECT P.ID, P.FIRST_NAME, P.LAST_NAME FROM PERSON WHERE EXISTS(SELECT D.ID FROM DELIVERY WHERE D.DRIVER_ID = P.ID)
์๊ด ํ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์๋๊ฐ 10๋ฐฐ ์ด์ ํฅ์๋ฉ๋๋ค.
- ๋ง์ ๊ฒฝ์ฐ COUNT๊ฐ ์์ ํ ํ๊ธฐ๋์์ผ๋ฉฐ
๋๋ต์ ์ธ ๊ฐ์ ๊ณ์ฐ์ผ๋ก ๋์ฒด๋จ - ๋์
UPPER(s) LIKE JOHN%โ
์ฌ์ฉ
s ILIKE โJohn%โ
๊ฐ ํน์ ์์ฒญ์ ์๋๊ฐ 3~1000๋ฐฐ ๋นจ๋ผ์ง๋ ๊ฒฝ์ฐ๋ ์์์ต๋๋ค. ์ธ์์ ์ธ ์ฑ๋ฅ์๋ ๋ถ๊ตฌํ๊ณ ์ฒ์์๋ ์๋ฃํ๋ ๋ฐ 10ms๊ฐ ๊ฑธ๋ฆฌ๊ณ , 3๋ฒ์งธ๋ก ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ ์ค ํ๋์ด๋ฉฐ, ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๋ ์๊ฐ์ XNUMX๋ถ์ XNUMX%๋ฅผ ์ฐจ์งํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฐ ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ์ ํ์ ์ฟผ๋ฆฌ ๊ทธ๋ฃน์ ๋์ผํ ๋ฐฉ๋ฒ์ ์ ์ฉํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ๋ช ํผ์ผํธ์ ์ด์ต์ ์ป์์ต๋๋ค. ์๋ฐฑ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์๋์ผ๋ก ๊ฒํ ํ๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ธฐ ์ํด ์ ๊ท์์ ์ฌ์ฉํ์ฌ ๋์ผํ ์ ํ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ๋ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฟผ๋ฆฌ ๊ทธ๋ฃน์ ์๋์ผ๋ก ๊ฒ์ํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์ฝ๊ฐ์ ๋ ธ๋ ฅ์ผ๋ก๋ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํฌ ์ ์์์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ ์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง 30๋ ๋์ ๋์ผํ ํ๋์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํด ์์ต๋๋ค. ์ผ์ผ ํ๊ท ๋ถํ๋ ์ฝ 70%์ด๋ฉฐ, ํผํฌ ๋๋ 10%์ ์ด๋ฆ ๋๋ค. ์์ฒญ ๊ฑด์์ ์ฌ์ฉ์ ์๋ ์ฝ XNUMX๋ฐฐ ์ฆ๊ฐํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ์ ๋์ผํ TOP-MEDIUM ์์ฒญ ๊ทธ๋ฃน์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ๋๋ถ์ ๋๋ค. TOP ๊ทธ๋ฃน์ ์๋ก์ด ์์ฒญ์ด ๋ํ๋๋ฉด ์ฆ์ ๋ถ์ํ์ฌ ์๋๋ฅผ ๋์ด๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค. ์ฟผ๋ฆฌ ๋ถ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์ฃผ์ผ์ ํ ๋ฒ MEDIUM ๊ทธ๋ฃน์ ๊ฒํ ํฉ๋๋ค. ์ต์ ํ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ์๊ณ ์๋ ์๋ก์ด ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์ ์ํ๊ฒ ๋ณ๊ฒฝํฉ๋๋ค. ๋๋๋ก ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ์ ๋์์ ์ ์ฉํ ์ ์๋ ์๋ก์ด ์ต์ ํ ๋ฐฉ๋ฒ์ ์ฐพ์ต๋๋ค.
์ฐ๋ฆฌ์ ์์ธก์ ๋ฐ๋ฅด๋ฉด ํ์ฌ ์๋ฒ๋ ์ฌ์ฉ์ ์๊ฐ 3~5๋ฐฐ ๋ ์ฆ๊ฐํด๋ ๊ฒฌ๋ ์ ์์ ๊ฒ์
๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ์๊ฒ๋ ๋ ํ๋์ ๋น๊ฒฐ์ด ์์ต๋๋ค. ๊ถ์ฅ๋๋ ๋๋ก ์์ง SELECT ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฌ๋ก ์ ์กํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ "์คํฌ"๋ฅผ ์ผ๊ธฐ ์ ์ ๋จผ์ "์ค๋งํธ" ์ต์ ํ์ ๊ฐ๋ฅ์ฑ์ ์์ ํ ์์งํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์์์ ์ผ๋ก ์ํํ์ง ์์ต๋๋ค.
์๋ฃ๋ ์์
์ ๋นํ์ ์ผ๋ก ์ดํด๋ณด๋ฉด ์์ง ํ์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ๋ฌธ๊ฐ์ ์๊ฐ์ ๋ญ๋นํ๋ ๋์ ๋ ๊ฐ๋ ฅํ ์๋ฒ๋ฅผ ๊ตฌ์
ํ์ญ์์ค. ์๋ฒ ๋น์ฉ์ ๊ทธ๋ฆฌ ๋์ง ์์ ์ ์์ต๋๋ค. ํนํ ์์ง ์์ง์ ํ์ฅ์ ํ๊ณ๋ฅผ ๋ฒ์ด๋์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ ๊ฑด์๋ง 10๋ฐฐ ์ฆ๊ฐํ์ต๋๋ค. ๋ช ๋
์ด ์ง๋๋ฉด์ ์์คํ
์ ๊ธฐ๋ฅ์ด ํฅ์๋์ด ์ด์ ๋ ๋ ๋ง์ ์ ํ์ ์์ฒญ์ด ๋ฐ์ํ๊ณ ์์ต๋๋ค. ์บ์ฑ ๋๋ถ์ ๊ธฐ์กด ๊ธฐ๋ฅ์ด ๋ ์ ์ ์์ฒญ์ผ๋ก ๋ ํจ์จ์ ์ผ๋ก ์ํ๋ฉ๋๋ค. ์ด๋ ์ค์ ๊ฐ์ ๊ณ์๋ฅผ ์ป๊ธฐ ์ํด ์์ ํ๊ฒ 5๋ฅผ ๋ ๊ณฑํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ฅ ๋ณด์์ ์ผ๋ก ์ถ์ ํ๋ฉด ๊ฐ์๋๊ฐ 50๋ฐฐ ์ด์์ด์๋ค๊ณ ํ ์ ์์ต๋๋ค. ์๋ฒ๋ฅผ ์์ง์ผ๋ก ํ๋ค๋ฉด ๋น์ฉ์ด 50๋ฐฐ ๋ โโ๋ง์ด ๋ญ๋๋ค. ํนํ ํ ๋ฒ ์ต์ ํ๋ฅผ ์ํํ๋ฉด ํญ์ ์๋ํ๋ฉฐ, ์๋ ์๋ฒ์ ๋ํ ๋น์ฉ์ด ๋งค๋ฌ ์ฒญ๊ตฌ๋๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์ถ์ฒ : habr.com