728x90
๋ฐ˜์‘ํ˜•

4์žฅ ์•…์„ฑ SQL ํŠœ๋‹์œผ๋กœ ์ดˆ๋ณด์ž ํƒˆ์ถœํ•˜๊ธฐ

โš ๏ธ ๊ฐ ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค๋Š” ์ฑ…์„ ์ฐธ์กฐโš ๏ธ

์ฐธ๊ณ  ์‚ฌํ•ญ (3์žฅ ๋‚ด์šฉ)

(4์žฅ์˜ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ 3์žฅ์—์„œ ์ด์ •๋„๋Š” ์•Œ์•„์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์ž‘์„ฑํ•จ.)

์ฟผ๋ฆฌ ํŠœ๋‹์„ ๊ณ ๋ คํ•  ๋•Œ ํ˜„์žฌ ํ•ด๋‹น ์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ์‹คํ–‰ ๊ณ„ํš์„ ํ†ตํ•ด ์‹คํ–‰๋˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

EXPLAIN, DESCRIBE , DESC 3๊ฐ€์ง€ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

EXPLAIN SQL๋ฌธ;
DESCRIBE SQL๋ฌธ;
DESC SQL๋ฌธ;
-- EXPLAIN ์‹คํ–‰๋ฌธ
EXPLAIN
SELECT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„. ์‚ฌ์›.์„ฑ, ๊ธ‰์—ฌ.์—ฐ๋ด‰,
	(SELECT MAX(๋ถ€์„œ๋ฒˆํ˜ธ)
		FROM ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ as ๋งคํ•‘ WHERE ๋งคํ•‘.์‚ฌ์›๋ฒˆํ˜ธ = ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ) ์นด์šดํŠธ
FROM ์‚ฌ์›, ๊ธ‰์—ฌ
WHERE ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = 10001
	AND ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๊ธ‰์—ฌ.์‚ฌ์›๋ฒˆํ˜ธ;

-- EXPLAIN ์‹คํ–‰ ๊ฒฐ๊ณผ

id select_type table partitions type possible_keys

1 PRIMARY ์‚ฌ์› NULL const PRIMARY
1 PRIMARY ๊ธ‰์—ฌ NULL ref PRIMARY
2 DEPENDENT SUBQUERY NULL NULL NULL NULL

key key_len ref rows filtered Extra

PRIMARY 4 const 1 100.00 NULL
PRIMARY 4 const 17 100.00 NULL
NULL NULL NULL NULL NULL Select tables optimized away

id

์‹คํ–‰ ์ˆœ์„œ๋ฅผ ํ‘œ์‹œ.

ID์˜ ์ˆซ์ž๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋จผ์ € ์ˆ˜ํ–‰. ID๊ฐ€ ๊ฐ™์€ ๊ฐ’์ด๋ผ๋ฉด ๋‘ ๊ฐœ ํ…Œ์ด๋ธ”์˜ ์กฐ์ธ์ด ์ด๋ฃจ์–ด์ง.

select_type

SQL ๋ฌธ์„ ๊ตฌ์„ฑํ•˜๋Š” SELECT ๋ฌธ์˜ ์œ ํ˜•์„ ํ‘œ์‹œ.

์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ์—†๋Š” ๋‹จ์ˆœ SIMPLE, ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋Š” ์ฟผ๋ฆฌ์˜ ์ฃผ ์ฟผ๋ฆฌ, UNION ์ฟผ๋ฆฌ ๋“ฑ์„ ํ‘œ์‹œ.

table

ํ…Œ์ด๋ธ” ๋ช…์„ ํ‘œ์‹œ

partitions

๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋…ผ๋ฆฌ์ ์ธ ์˜์—ญ์„ ํ‘œ์‹œ.

์‚ฌ์ „์— ์ •์˜ํ•œ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ์„ ํƒ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ด ์ข‹์Œ.

๋งŒ์•ฝ, ๋„ˆ๋ฌด ๋งŽ์€ ์˜์—ญ์˜ ํŒŒํ‹ฐ์…˜์— ์ ‘๊ทผํ•˜๋ฉด ํŒŒํ‹ฐ์…˜ ํŠœ๋‹ ๊ณ ๋ ค.

type

ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„์ง€์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ญ๋ชฉ.

  • system
    • ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
    • ์„ฑ๋Šฅ์ƒ ์ตœ๊ณ 
  • const
    • ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ 1๊ฑด์ผ๋•Œ
    • ์„ฑ๋Šฅ ๋งค์šฐ ์šฐ์ˆ˜, ์ง€ํ–ฅํ•ด์•ผ ํ•  ํƒ€์ž…
  • eq_ref
    • ์กฐ์ธ์ด ์ˆ˜ํ–‰๋  ๋•Œ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ณ ์œ  ์ธ๋ฑ์Šค ๋˜๋Š” ๊ธฐ๋ณธ ํ‚ค๋กœ ๋‹จ 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ์˜ ํƒ€์ž….
    • ์กฐ์ธ ์ˆ˜ํ–‰์‹œ ๊ฐ€์žฅ ์„ฑ๋Šฅ ์ข‹์Œ
  • ref
    • ์กฐ์ธ์ด ์ˆ˜ํ–‰๋  ๋•Œ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฒ”์œ„๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ
    • ์ฆ‰, 1 : N ๊ด€๊ณ„์—์„œ ๋งŽ์ด ๋‚˜ํƒ€๋‚จ. ๋˜๋Š” ์ธ๋ฑ์Šค ์—ด์„ ํ†ตํ•œ ๋น„๊ต ์—ฐ์‚ฐ์ž(< > =)์—์„œ๋„ ๋‚˜ํƒ€๋‚จ.
    • ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ณ ๋ ค ๋จ.
  • ref_or_null
    • IS NULL ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ตœ์ ํ™” ๋ฐฉ์‹
    • NULL ๋ฐ์ดํ„ฐ ์–‘์ด ์ ๋‹ค๋ฉด ํšจ์œจ์ , ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ๋‹ค๋ฉด ํŠœ๋‹ ๋Œ€์ƒ.
  • range
    • ๋น„๊ต์—ฐ์‚ฐ์ž, BETWEEN, IN ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋ฒ”์œ„ ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹.
    • ์Šค์บ” ๋ฒ”์œ„๊ฐ€ ๋„“์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์š”์ธ ํŠœ๋‹ ๋Œ€์ƒ.
  • fulltext
    • ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Full Text Index ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ.
  • index_merge
    • ํŠน์ • ํ…Œ์ด๋ธ”์— ์ƒ์„ฑ๋œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋ณ‘ํ•ฉ๋˜์–ด ๋™์‹œ์— ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ.
  • index
    • ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”.
  • ALL
    • ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”
    • ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜, ์˜ตํ‹ฐ๋งˆ์ด์ € ํŒ๋‹จ์— ์ธ๋ฑ์Šค๊ฐ€ ๋น„ํšจ์œจ์ผ ๊ฒฝ์šฐ.
    • ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ & ์ถ”๊ฐ€๋กœ ํŠœ๋‹ ๊ฐ€๋Šฅ
    • ์ „์ฒด ํ…Œ์ด๋ธ”์—์„œ 10 ~ 20% ์ด์ƒ ๋ถ„๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ƒ ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

possible_keys

์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ํ™”์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค ๋ชฉ๋ก์„ ์ถœ๋ ฅ.

๋‹ค๋งŒ, ์‹ค์ œ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฌธ ์‹คํ–‰์— ์‚ฌ์šฉ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠœ๋‹ํ•  ๋•Œ ๋ณ„๋กœ ๋„์›€์€ ์•ˆ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

key

์˜ตํƒ€๋งˆ์ด์ €๊ฐ€ ์ตœ์ ํ™”์— ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ ํ‚ค ๋˜๋Š” ์ธ๋ฑ์Šค๋ช…์„ ์˜๋ฏธ.

๋น„ํšจ์œจ์ ์ธ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ํ˜น์€ ์ธ๋ฑ์Šค ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํŠœ๋‹ ๋Œ€์ƒ.

key_len

์‚ฌ์šฉ๋œ ํ‚ค๋ณธ ํ‚ค ๋˜๋Š” ์ธ๋ฑ์Šค์˜ byte ์ˆ˜.

ex) ์‚ฌ์› ๋ฒˆํ˜ธ(INT) + ๋‚ ์งœ(VARCHAR(50) = 4 + (50 + 1) * 3 = 159

ref

์กฐ์ธ์˜ ์กฐ๊ฑด๋ฌธ

rows

SQL๋ฌธ ์ˆ˜ํ–‰์—์„œ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ˆ˜.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋Š” ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํ•œ ์‹ ๋ขฐ๋Š” ๋ถˆ๊ฐ€๋Šฅ.

๊ทธ๋Ÿฌ๋‚˜, ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์— ๋„ˆ๋ฌด ๋งŽ์ด ์ ‘๊ทผํ•˜๊ณ  ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ๋œป. ํŠœ๋‹ ๋Œ€์ƒ.

filtered

DB ์—”์ง„์— ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ•„ํ„ฐ๋ง ๋๋Š”์ง€์— ๋Œ€ํ•œ ํผ์„ผํŠธ ์ˆ˜์น˜.

ex) 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋„˜์–ด์˜ด, ๊ฒฐ๊ณผ 10๊ฐœ โ‡’ filtered = 10.00

extra

SQL ๋ฌธ์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€์— ๊ด€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋“ค์„ ํ‘œ์‹œ.

์ข…๋ฅ˜๊ฐ€ ๊ฐœ๋งŽ์Œ. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ค‘๋ณต ์ถœ๋ ฅ ๊ฐ€๋Šฅ. ๋‚œ ๋‚ด๊ฐ€ ๋งŽ์ด ์ ‘ํ• ๊ฒƒ ๊ฐ™์€๊ฒƒ๋งŒ ์ž‘์„ฑํ•  ์˜ˆ์ •

  • Distinct
    • DISTINCT , UNION ๊ตฌ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์ค‘๋ณต์ด ์ œ๊ฑฐ๋˜์–ด ์œ ์ผํ•œ ๊ฐ’์„ ์ฐพ์„ ๋•Œ.
  • Using where
    • WHERE ์ ˆ์˜ ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ๋•Œ.
  • Using temporary
    • ๋ฐ์ดํ„ฐ์˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ ์ž ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ.
    • GROUP BY , ORDER BY ์ •๋ ฌ ์ž‘์—… ํ˜น์€ ์ค‘๋ณต ์ œ๊ฑฐ ์ž‘์—…์— ์‚ฌ์šฉ.
  • Using index
    • ๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋งŒ ์ฝ์–ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ. (Covering Index)
    • ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์šฐ์ˆ˜.

4.2 SQL ๋ฌธ ๋‹จ์ˆœ ์ˆ˜์ •์œผ๋กœ ์ฐฉํ•œ ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ

ํŠœ๋‹ ์ด์ „์˜ ์ฟผ๋ฆฌ์™€ ํŠœ๋‹ ์ดํ›„์˜ ์ฟผ๋ฆฌ์— EXPLAIN ๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ค์ ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด์„œ ํ•˜๋ฉด ๋„์›€์ด ๋งŽ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ํ‚ค๋ณธ ํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ๊ธฐ๋ณธ ํ‚ค ์ธ๋ฑ์Šค ์•ˆํƒ€๋Š” ๊ฒฝ์šฐ
SELECT *
FROM ์‚ฌ์›
WHERE SUBSTRING(์‚ฌ์›๋ฒˆํ˜ธ, 1, 4) = 1100
	AND LENGTH(์‚ฌ์›๋ฒˆํ˜ธ) = 5;

-- 30๋งŒ๊ฑด ๋ฐ์ดํ„ฐ 0.23์ดˆ

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT *
FROM ์‚ฌ์›
WHERE ์‚ฌ์›๋ฒˆํ˜ธ BETWEEN 11000 AND 11009

-- 30๋งŒ๊ฑด ๋ฐ์ดํ„ฐ 0.00์ดˆ

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- NOT NULL ์ปฌ๋Ÿผ์— IFNULL์„ ์‚ฌ์šฉํ•ด์„œ NULL Check ํ•˜๋Š” ๊ฒฝ์šฐ
-- IFNULL () ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•ด Using Temporary๋กœ DB๋‚ด์— ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ์—ฐ์‚ฐํ•˜๋Š” ๊ณผ์ • ์ถ”๊ฐ€๋จ
SELECT IFNULL(์„ฑ๋ณ„, 'NO DATA') AS ์„ฑ๋ณ„, COUNT(1) ๊ฑด์ˆ˜
FROM ์‚ฌ์›
GROUP BY IFNULL(์„ฑ๋ณ„, 'NO DATA')

-- 30๋งŒ๊ฑด ๋ฐ์ดํ„ฐ 0.77์ดˆ

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT ์„ฑ๋ณ„, COUNT(1) ๊ฑด์ˆ˜
FROM ์‚ฌ์›
GROUP BY ์„ฑ๋ณ„

-- 30๋งŒ๊ฑด ๋ฐ์ดํ„ฐ 0.10์ดˆ
-- ์ฆ‰, ๋ฌด์˜๋ฏธํ•œ ํ•จ์ˆ˜์™€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ์ง€์–‘ํ•˜์ž.

ํ˜•๋ณ€ํ™˜์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์—ฌ๋ถ€ ๋ผ๋Š” ์ปฌ๋Ÿผ์˜ ํƒ€์ž…์€ VARCHAR(1) ์ด๋‹ค.
-- DB์—์„œ ๋ฌต์‹œ์  ํ˜•๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•˜์—ฌ ์‚ฌ์šฉ์—ฌ๋ถ€ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•จ.
SELECT COUNT(1)
FROM ๊ธ‰์—ฌ
WHERE ์‚ฌ์šฉ์—ฌ๋ถ€ = 1;

-- ์•ฝ 5๋งŒ๊ฑด ๋ฐ์ดํ„ฐ 0.15์ดˆ

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT COUNT(1)
FROM ๊ธ‰์—ฌ
WHERE ์‚ฌ์šฉ์—ฌ๋ถ€ = '1'

-- ์•ฝ 5๋งŒ๊ฑด ๋ฐ์ดํ„ฐ 0.01์ดˆ

์—ด์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ์„ฑ๋ณ„ ๊ณผ ์„ฑ์„ ๋ฌถ์–ด ๋†“์€ ์ธ๋ฑ์Šค๊ฐ€ ์ด๋ฏธ ์กด์žฌ.
-- ๊ทธ๋Ÿฌ๋‚˜ CONCAT ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ.
SELECT *
FROM ์‚ฌ์›
WHERE CONCAT(์„ฑ๋ณ„, ' ', ์„ฑ) = 'M Radwan'
--์•ฝ 100๊ฑด์˜ ๋ฐ์ดํ„ฐ ์ถ”์ถœ 0.25์ดˆ

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT *
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'M'
	AND ์„ฑ = 'Radwan'
-- ๋™์ผํ•œ ๊ฒฐ๊ณผ 0.01์ดˆ

์Šต๊ด์ ์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋‚˜์œ SQL๋ฌธ

-- ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š”๋ฐ DISTINCT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต์ œ๊ฑฐ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ ๊ฒฝ์šฐ.
SELECT DISTINCT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„, ์‚ฌ์›.์„ฑ, ๋ถ€์„œ๊ด€๋ฆฌ์ž.๋ถ€์„œ๋ฒˆํ˜ธ
FROM ์‚ฌ์›
	JOIN ๋ถ€์„œ๊ด€๋ฆฌ์ž
		ON(์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๋ถ€์„œ๊ด€๋ฆฌ์ž.์‚ฌ์›๋ฒˆํ˜ธ)

-- EXPLINE ์‹คํ–‰ ๊ณ„ํš์—์„œ type = eq_ref ๋กœ ์‚ฌ์›๋ฒˆํ˜ธ๋ผ๋Š” ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ 
-- ๋‹จ 1๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
-- DISTINCT ํ‚ค์›Œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•œ ๋’ค ์ค‘๋ณต ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€๋จ.
-- ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, 1๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ.

-- ์ฟผ๋ฆฌ ํŠœ๋‹
SELECT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์ด๋ฆ„, ์„ฑ, ๋ถ€์„œ๋ฒˆํ˜ธ
FROM ์‚ฌ์›
	JOIN ๋ถ€์„œ๊ด€๋ฆฌ์ž
		ON (์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๋ถ€์„œ๊ด€๋ฆฌ์ž.์‚ฌ์›๋ฒˆํ˜ธ)

๋‹ค์ˆ˜ ์ฟผ๋ฆฌ๋ฅผ UNION ์—ฐ์‚ฐ์ž๋กœ๋งŒ ํ•ฉ์น˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- UNION ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ ๋‘๊ฐœ์˜ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
-- ๊ทธ ๊ณผ์ •์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋œ๋‹ค.
-- ๊ทธ๋Ÿฌ๋‚˜, ํ•ด๋‹น ์ฟผ๋ฆฌ์—์„œ๋Š” ์ค‘๋ณต์— ๋Œ€ํ•œ ์ œ๊ฑฐ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๋‹ค.
-- ๋”ฐ๋ผ์„œ, ๋‹จ์ˆœํžˆ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ์„ ํ•˜๋Š” UNION ALL์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
SELECT 'M' AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'M'
	AND ์„ฑ = 'Baba'

UNION

SELECT 'F', AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'F'
	AND ์„ฑ = 'Baba'

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT 'M' AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'M'
	AND ์„ฑ = 'Baba'

UNION ALL

SELECT 'F', AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'F'
	AND ์„ฑ = 'Baba'

์ธ๋ฑ์Šค ๊ณ ๋ ค ์—†์ด ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ์„ฑ๋ณ„ + ์„ฑ์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์žกํ˜€์žˆ๋‹ค.
-- ์ฆ‰, ์„ฑ๋ณ„์„ ํ†ตํ•ด ์ •๋ ฌ์ด ๋œ ํ›„ ์„ฑ์œผ๋กœ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋‹ค.
-- ์ด ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
-- ๊ทธ๋Ÿฌ๋‚˜, ์„ฑ + ์„ฑ๋ณ„์˜ ๊ฒฝ์šฐ ์ •๋ ฌ์ด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ๋ฃจํ•‘๋˜๊ฒŒ ๋œ๋‹ค.
SELECT ์„ฑ, ์„ฑ๋ณ„, COUNT(1) as ์นด์šดํŠธ
FROM ์‚ฌ์›
GROUP BY ์„ฑ, ์„ฑ๋ณ„

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT ์„ฑ, ์„ฑ๋ณ„, COUNT(1) AS ์นด์šดํŠธ
FROM ์‚ฌ์›
GROUP BY ์„ฑ๋ณ„, ์„ฑ

์—‰๋šฑํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ์ฒ˜์Œ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ๋ณด์•˜์„๋•Œ ์ด๊ฒŒ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ๊ฑฐ์ง€? 
-- ๊ธฐ๋ณธ ํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๊ณ  ๊ดœ์ฐฎ์€๊ฑฐ ์•„๋‹Œ๊ฐ€??๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
-- ์ด 30๋งŒ๋ช…์˜ ์‚ฌ์›์—์„œ ์ž…์‚ฌ์ผ์ž๊ฐ€ 1989๋…„์ธ ๊ฒฝ์šฐ๋Š” ์ด 2๋งŒ๊ฑด, ์‚ฌ์›๋ฒˆํ˜ธ๊ฐ€ 10๋งŒ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๋Š” 20๋งŒ๊ฑด์ด ์กด์žฌํ•œ๋‹ค.
-- ์ด ๊ฒฝ์šฐ๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์ ‘๊ทผํ• ๋•Œ ์ž…์‚ฌ์ผ์ž๋ฅผ ํ†ตํ•ด ๋จผ์ € ์ ‘๊ทผํ•˜๋Š”๊ฒŒ ๋” ๋‚ซ๋‹ค.
SELECT ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์ž…์‚ฌ์ผ์ž LIKE '1989%'
	AND ์‚ฌ์›๋ฒˆํ˜ธ > 100000;

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์ž…์‚ฌ์ผ์ž >= '1989-01-01' AND ์ž…์‚ฌ์ผ์ž < '1990-01-01' USE INDEX(I_์ž…์‚ฌ์ผ์ž)
	AND ์‚ฌ์›๋ฒˆํ˜ธ > 100000;

-- 0.13์ดˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ 0.02

๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ๊ฐ€์ •: ์ด 60๋งŒ๊ฑด ๋ฐ์ดํ„ฐ, ๊ฒฐ๊ณผ๋Š” ์ด 30๋งŒ๊ฑด 
-- ์‹คํ–‰ ๊ฒฐ๊ณผ ์ถœ์ž…๋ฌธ ์ปฌ๋Ÿผ์˜ ์ธ๋ฑ์Šค ์Šค์บ”์œผ๋กœ ์•ฝ 3.7์ดˆ
-- ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์•ฝ 50%์— ๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ์— ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ๋” ์•ˆ ์ข‹์€ ์ƒํ™ฉ์ด ์žˆ๋‹ค.
-- ์ „์ฒด ํ…Œ์ด๋ธ”์˜ 10 ~ 20% ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์ด ์„ฑ๋Šฅ์ด ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.
SELECT *
FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก
WHERE ์ถœ์ž…๋ฌธ = 'B'

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT *
FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก IGNORE INDEX(I_์ถœ์ž…๋ฌธ)
WHERE ์ถœ์ž…๋ฌธ = 'B'

-- ํŠœ๋‹ ์‹คํ–‰ ๊ฒฐ๊ณผ 0.85์ดˆ

๋ฒ”์œ„ ์กฐ๊ฑด์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ Index Range Scan ์ด๋‹ค. ๊ตณ.
-- ๊ทธ๋Ÿฌ๋‚˜, ์ด 30๋งŒ๊ฑด์˜ ์‚ฌ์› ๋ฐ์ดํ„ฐ์—์„œ ํ•ด๋‹น ๋ฒ”์œ„์˜ ๋ฐ์ดํ„ฐ๋Š” ์•ฝ 5๋งŒ๊ฑด์ด๋‹ค. ์‹คํ–‰ ์‹œ๊ฐ„ 1.21์ดˆ
-- ์ด ๋ฐ์ดํ„ฐ์˜ 17ํผ์„ผํŠธ์— ํ•ด๋‹น๋จ.
-- ์ด ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์Šค์บ”์œผ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค์˜ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๊ธฐ๋ณด๋‹ค๋Š” 
-- ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” ๋ฐฉ์‹์„ ๊ณ ์ •์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ ค
SELECT ์ด๋ฆ„, ์„ฑ
FROM ์‚ฌ์›
WHERE ์ž…์‚ฌ์ผ์ž BETWEEN STR_TO_DATE('1994-01-01', '%Y-%m-%d')
	AND STR_TO_DATE('2000-12-31', '%Y-%m-%d')

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT ์ด๋ฆ„, ์„ฑ
FROM ์‚ฌ์›
WHERE YEAR(์ž…์‚ฌ์ผ์ž) BETWEEN '1994' AND '2000'
-- ์ธ๋ฑ์Šค๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”. ์‹คํ–‰ ์‹œ๊ฐ„ 0.2์ดˆ

์™œ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์ด ๋” ํšจ์œจ์ ์ผ๊นŒ?

๊ฐ€์ •: ์ „์ฒด ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ค‘ ์ƒ๋‹น๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ(10 ~ 20%๊ฐ€ ๋„˜๋Š” ๋ฐ์ดํ„ฐ)๋ฅผ ์ฐพ์•„์˜ค๋Š” ๊ฒฝ์šฐ.

  1. ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ.

์ธ๋ฑ์Šค ์Šค์บ”์œผ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค์˜ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒ.

๋””์Šคํฌ ์˜ค๋ฒ„ํ—ค๋“œ ์ฆ๊ฐ€.

์ „์ฒด ๋ฐ์ดํ„ฐ ์ค‘ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์— ํ•„์š”ํ•œ ์ธ๋ฑ์Šค์— ์ ‘๊ทผ ํ›„ ๋””์Šคํฌ์— ์ ‘๊ทผํ•˜๋Š” ๋น„์šฉ.

  1. ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์„ ํ•˜๋Š” ๊ฒฝ์šฐ.

์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ๋””์Šคํฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์Œ.

์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•œ๋’ค ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ • ์—†์ด, ๋ฐ”๋กœ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผ.

ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์—†์ด ํ…Œ์ด๋ธ”์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ๋‹ค์ˆ˜์˜ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ฏ€๋กœ ๋” ํšจ์œจ์ ์ธ SQL ๋ฌธ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ.

4.3 ํ…Œ์ด๋ธ” ์กฐ์ธ ์„ค์ • ๋ณ€๊ฒฝ์œผ๋กœ ์ฐฉํ•œ ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์ž‘์€ ํ…Œ์ด๋ธ”์ด ๋จผ์ € ์กฐ์ธ์— ์ฐธ์—ฌํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ๊ฐ€์ •: ๋ถ€์„œ = 9, ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ = ์•ฝ 30๋งŒ, ๋งคํ•‘.์‹œ์ž‘์ผ์ž >= '2002-03-01' = ์•ฝ 1์ฒœ 3๋ฐฑ = 0.4%, 
-- ์•ฝ 1์ฒœ3๋ฐฑ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ 13.2์ดˆ ์‹คํ–‰์‹œ๊ฐ„ ์†Œ์š”.
-- ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” = ๋ถ€์„œ, ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” = ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘. ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ ์‹คํ–‰๋จ.
-- ์ฆ‰, ๋ถ€์„œ 9๊ฐœ ๊ฐ€์ง€๊ณ  30๋งŒ๊ฐœ ๋žœ๋ค ์•ก์„ธ์Šค ํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ณ  ๊ฑฐ๊ธฐ์„œ ํ•„ํ„ฐ๋ง ์ง„ํ–‰.
-- ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋”๋ผ๋„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ๊ฒฝ์šฐ ๋žœ๋ค ์•ก์„ธ์Šค ๋น„์šฉ์ด ๋น„์‹ธ๋‹ค.
-- ๊ทธ๋ ‡๋‹ค๋ฉด ์กฐ๊ฑด์ ˆ์„ ๋จผ์ € ์ด์šฉํ•ด์„œ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ 30๋งŒ -> 1์ฒœ 3๋ฐฑ์œผ๋กœ ์ค„์ธ๋‹ค๋ฉด?
SELECT ๋งคํ•‘.์‚ฌ์›๋ฒˆํ˜ธ, ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
FROM ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ๋งคํ•‘, ๋ถ€์„œ
WHERE ๋งคํ•‘.๋ถ€์„œ๋ฒˆํ˜ธ = ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
	AND ๋งคํ•‘.์‹œ์ž‘์ผ์ž >= '2002-03-01';

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT STRAIGHT_JOIN
	๋งคํ•‘.์‚ฌ์›๋ฒˆํ˜ธ,
	๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
FROM ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ๋งคํ•‘, ๋ถ€์„œ
WHERE ๋งคํ•‘.๋ถ€์„œ๋ฒˆํ˜ธ = ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
	AND ๋งคํ•‘.์‹œ์ž‘์ผ์ž >= '2002-03-01'

-- ์‹คํ–‰๊ฒฐ๊ณผ 0.17์ดˆ
-- ํŠœ๋‹ ํ›„ ์‹คํ–‰ ๊ณ„ํš
-- ์ƒ๋Œ€์ ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰์ธ ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ํ…Œ์ด๋ธ” -> ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์œผ๋กœ ์ฒ˜๋ฆฌ. Type: index -> ALL
-- ๋ถ€์„œ ํ…Œ์ด๋ธ” -> ๊ธฐ๋ณธ ํ‚ค๋กœ ๋ฐ˜๋ณต ์ ‘๊ทผ Type: ref -> eq_ref

๋ฉ”์ธ ํ…Œ์ด๋ธ”์— ๊ณ„์† ์˜์กดํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ๋ฉ”์ธ์ธ ์‚ฌ์› ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์กฐ๊ฑด์„ ์ „๋‹ฌ๋ฐ›์•„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ์„œ๋ธŒ์ฟผ๋ฆฌ์ด๋‹ค.
-- select_type: DEPENDENTY SUBQUERY
-- ์‹คํ–‰ ๊ณ„ํš์˜ select_type ํ•ญ๋ชฉ์— DEPENDENT ๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด,
-- ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์ ˆ์„ ๋ฐ›์€ ๋’ค ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ํŠœ๋‹ ๋Œ€์ƒ์œผ๋กœ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.
SELECT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„, ์‚ฌ์›.์„ฑ
FROM ์‚ฌ์›
WHERE ์‚ฌ์›๋ฒˆํ˜ธ > 450000
	AND ( SELECT MAX(์—ฐ๋ด‰)
				FROM ๊ธ‰์—ฌ
				WHERE ์‚ฌ์›๋ฒˆํ˜ธ = ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ
			) > 100000;

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„, ์‚ฌ์›.์„ฑ
FROM ์‚ฌ์›
WHERE ์‚ฌ์›๋ฒˆํ˜ธ > 450000
	AND ์‚ฌ์›.์‚ฌ์›Œ๋„Œํ˜ธ = ๊ธ‰์—ฌ.์‚ฌ์›๋ฒˆํ˜ธ
GROUP BY ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ
HAVING MAX(๊ธ‰์—ฌ.์—ฐ๋ด‰) > 1000000

-- 0.57 -> 0.11์ดˆ 

์ €์ž์˜ ํŒ ์„œ๋ธŒ์ฟผ๋ฆฌ vs ์กฐ์ธ

์ €์ž๋Š” 10๋…„ ๊ฒฝ๋ ฅ์˜ DBA ๋ผ๊ณ  ํ•œ๋‹ค.

์ €์ž์˜ ๊ทธ๊ฐ„ ๊ฒฝํ—˜์ƒ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์กฐ์ธ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํŽธ์ด ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ํ•œ๋‹ค.

๋ถˆํ•„์š”ํ•œ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

-- ์‹คํ–‰ ์‹œ๊ฐ„: 22.5์ดˆ
-- ์ด ๊ฒฝ์šฐ ์‚ฌ์›์ž…์ถœ์ž‰๊ธฐ๋ก์—์„œ ์ถœ์ž…๋ฌธ A์— ๊ด€ํ•œ ๊ธฐ๋ก์ด ์žˆ๋Š” ์‚ฌ์›์ด ๋ช‡๋ช…์ธ์ง€๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.
-- ๋”ฐ๋ผ์„œ, ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก๊ณผ ์กฐ์ธํ•˜์—ฌ EXIST ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ง‘๊ณ„ํ•˜๋ฉด ๋œ๋‹ค.
SELECT COUNT(DISTINCT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ) AS ๋ฐ์ดํ„ฐ๊ฑด์ˆ˜
FROM ์‚ฌ์›,
	( SELECT ์‚ฌ์›๋ฒˆํ˜ธ
		FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก AS ๊ธฐ๋ก
		WHERE ์ถœ์ž…๋ฌธ = 'A'
	)
WHERE ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๊ธฐ๋ก.์‚ฌ์›๋ฒˆํ˜ธ

-- ํŠœ๋‹ ๊ฒฐ๊ณผ
SELECT COUNT(1) AS ๋ฐ์ดํ„ฐ๊ฑด์ˆ˜
FROM ์‚ฌ์›
WHERE EXISTS ( 
				SELECT 1
				FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก AS ๊ธฐ๋ก
				WHERE ์ถœ์ž…๋ฌธ = 'A'
					AND ๊ธฐ๋ก.์‚ฌ์›๋ฒˆํ˜ธ = ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ
			)
-- ์‹คํ–‰ ์‹œ๊ฐ„: 0.5์ดˆ

FROM ์ ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ(์ธ๋ผ์ธ ๋ทฐ)๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋‚˜?

FROM ์ ˆ์˜ ์ธ๋ผ์ธ ๋ทฐ๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ์กฐ์ธ ๋ฐฉ์‹์ด ๋ทฐ ๋ณ‘ํ—˜(View Merging)์œผ๋กœ ์ตœ์ ํ™” ๋˜์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰๋œ๋‹ค.

SELECT COUNT(DISTINCT ๊ธฐ๋ก.์‚ฌ์›๋ฒˆํ˜ธ) AS ๋ฐ์ดํ„ฐ๊ฑด์ˆ˜
FROM ์‚ฌ์›, ์‚ฌ์›์ž…์ถœ์ž…๊ธฐ๋ก AS ๊ธฐ๋ก
WHERE ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๊ธฐ๋ก.์‚ฌ์›๋ฒˆํ˜ธ
	AND ์ถœ์ž…๋ฌธ = 'A'
728x90
๋ฐ˜์‘ํ˜•
MyeongDev