IT/SQL

[DB] SQL ์„ฑ๋Šฅ ์ตœ์ ํ™” (feat. SQL Optimization)

zi0_0 2025. 4. 9. 02:00

๐Ÿ“ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์กฐ์ธ ์ „๋žต 

1. ์กฐ์ธ ์ˆœ์„œ ์ตœ์ ํ™” 

  • ์ž‘์€ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์กฐ์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์–‘์„ ์ค„์—ฌ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๋ฐฉ์ง€
  • ์กฐ์ธ ์กฐ๊ฑด์ด ๋ช…ํ™•ํ•˜๋„๋ก ์ธ๋ฑ์Šค ์ ์šฉ (customer_id ๊ฐ™์€ PK, FK ํ™œ์šฉ) 

* MariaDB์—์„œ๋Š” `STRAIGHT_JOIN`์„ ํ†ตํ•ด ์ง€์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ ์กฐ์ธ ์ง€์ • ๊ฐ€๋Šฅ

์กฐ์ธ ํžŒํŠธ ์‚ฌ์šฉ 
: SQL ์‹คํ–‰ ์‹œ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์„ ํƒํ•˜๋Š” ์กฐ์ธ ๋ฐฉ์‹๊ณผ ์ˆœ์„œ๋ฅผ ๊ฐ•์ œ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ 
- Nested Loop Join : ์ž‘์€ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ํ…Œ์ด๋ธ”์— ๋ฐ˜๋ณต ์ ‘๊ทผ (๋ฃจํ”„ ๋ฐฉ์‹) 
- Sort Merge Join : ์–‘์ชฝ ํ…Œ์ด๋ธ”์„ ์ •๋ ฌํ•ด์„œ ๋ณ‘ํ•ฉ 
- Hash Join : ํ•œ์ชฝ ํ…Œ์ด๋ธ” ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„ ๋‹ค๋ฅธ ์ชฝ๊ณผ ์กฐ์ธ
* SELECT ๋ฐ”๋กœ ๋’ค์— ์‚ฌ์šฉ  

2. ์ธ๋ฑ์Šค ํ™œ์šฉ 

  • ON ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ์„ค์ • ์‹œ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ์—†๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ๋ฑ์Šค ์‹ ๊ทœ ์„ค์ • = `CREATE INDEX idx_customer ON Customers(customer_id)`

์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ์ฝ์–ด๋ด์•ผ ํ•จ!

 

๋”ฐ๋ผ์„œ 2๊ฐ€์ง€๋ฅผ ์กฐํ•ฉํ–ˆ์„ ๋•Œ SQL ์‹คํ–‰์ด ๋น ๋ฅธ ์ˆœ์„œ๋Š”

1. ์กฐ์ธ ์ˆœ์„œ์— ๋งž๊ฒŒ ์ธ๋ฑ์Šค๊นŒ์ง€ ์ž˜ ํ™œ์šฉํ•œ ๊ฒฝ์šฐ
2. ์กฐ์ธ ์ˆœ์„œ๋งŒ ํŠœ๋‹ํ•œ ๊ฒฝ์šฐ
3. ์กฐ์ธ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป๋์ง€๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์“ด ๊ฒฝ์šฐ 
4. ์กฐ์ธ ์ˆœ์„œ๋„ ํ‹€๋ฆฌ๊ณ  ์ธ๋ฑ์Šค๋„ ์•ˆ ์“ด ๊ฒฝ์šฐ

์œ„์™€ ๊ฐ™๋‹ค!

 

ํ…Œ์ด๋ธ” ๋ช…์นญ
- ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”, ์™ธ๋ถ€ ํ…Œ์ด๋ธ” : ์กฐ์ธ ์‹œ ๋จผ์ € ์•ก์„ธ์Šค (์ฝ๊ธฐ ์‹œ์ž‘)๋ผ์„œ ๊ธฐ์ค€์ด ๋˜๋Š” ํ…Œ์ด๋ธ” 
- ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”, ๋‚ด๋ถ€ ํ…Œ์ด๋ธ” : ์กฐ์ธ ์‹œ ๋‚˜์ค‘์— ์•ก์„ธ์Šค ๋˜๋Š” ํ…Œ์ด๋ธ” 

 

์˜ˆ์ œ๋กœ ์ดํ•ดํ•˜๊ธฐ

์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, 

EXPLAIN -- ์ด ์ฟผ๋ฆฌ๋ฅผ ์‹ค์ œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‹ค์ƒ๋˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด 
SELECT EMP.ENAME AS 'EMP ์ง์›๋ช…',
       DEPT.DNAME AS 'DEPT ๋ถ€์„œ๋ช…'
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
  AND DEPT.DEPTNO = '20'
  AND EMP.ENAME = 'SCOTT';

 

`FROM EMP, DEPT`๋ผ๊ณ  ์ผ๋‹ค๊ณ  ํ•ด์„œ ์กฐ์ธ ์ˆœ์„œ๋„ ๋ฌด์กฐ๊ฑด ์ด๋ ‡๊ฒŒ ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค

์™œ๋ƒ๋ฉด, ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋Š” ์ˆœ์„œ๋กœ ์ž๋™ ์กฐ์ธํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—..!

 

ํ•˜์ง€๋งŒ ์œ„์˜ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ EMP → DEPT ์ˆœ์„œ๋กœ ๊ฐ•์ œํ•˜๋ฉด ์„ฑ๋Šฅ์„ ๋” ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์™œ๋ƒ๋ฉด, `EMP.ENAME = 'SCOTT'`๊ฐ€ `DEPT.DEPNO='20'`๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ํ•„ํ„ฐ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

(= 20๋ฒˆ์ด๋ผ๋Š” ๋ถ€์„œ๋ฅผ ๊ฐ€์ง„ ์ง์›๋“ค๋ณด๋‹ค SCOTT๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์˜ ์ˆ˜๊ฐ€ ๋” ์ ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ)

 

์•ž์„œ ์ž‘์€ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์กฐ์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค ํ–ˆ๋Š”๋ฐ
์จŒ๋“  DEPT๊ฐ€ EMP๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋‹ˆ๊นŒ ๋จผ์ € ํ•˜๋Š” ๊ฒŒ ๋งž์ง€ ์•Š๋‚˜?

๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์ด ๋ฌธ์žฅ์—์„œ์˜ ํ•ต์‹ฌ์€ `์ž‘์€ ํ…Œ์ด๋ธ”`์ด ์•„๋‹ˆ๋ผ `๊ฒฐ๊ณผ ๊ฑด์ˆ˜๊ฐ€ ์ž‘์€ ํ…Œ์ด๋ธ”`์ด ๋จผ์ € ์™€์•ผ ํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ scott์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ emp ํ…Œ์ด๋ธ”์ด dept๋ณด๋‹ค ๊ฒฐ๊ณผ ๊ฑด์ˆ˜๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ์˜ค๋Š” ๊ฒƒ์ด ๋งž๋Š” ๊ฒƒ์ด๋‹ค. 

 

์กฐ์ธ ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. 

EXPLAIN
SELECT STRAIGHT_JOIN EMP.ENAME AS 'EMP ์ง์›๋ช…', DEPT.DNAME AS 'DEPT ๋ถ€์„œ๋ช…'
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
  AND DEPT.DEPTNO = '20'
  AND EMP.ENAME = 'SCOTT';

 

์›๋ž˜ STRAIGHT_JOIN์€ ์•„๋ž˜์™€ ๊ฐ™์ด `A STRAIGHT_JOIN B` ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์ด์ง€๋งŒ, 

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ SELECT ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ FROM ์ ˆ ์ˆœ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์กฐ์ธํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค. 

-- ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
SELECT ์ปฌ๋Ÿผ๋“ค
FROM ํ…Œ์ด๋ธ”1
STRAIGHT_JOIN ํ…Œ์ด๋ธ”2
ON ํ…Œ์ด๋ธ”1.์ปฌ๋Ÿผ = ํ…Œ์ด๋ธ”2.์ปฌ๋Ÿผ
WHERE ์กฐ๊ฑด

 

 

๐Ÿ“ ์กฐ์ธ์„ ํ†ตํ•œ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

Nested Loop Join

"์ž‘์€ ์™ธ๋ถ€ → ์ธ๋ฑ์Šค ์žˆ๋Š” ๋‚ด๋ถ€" ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์†Œ๊ทœ๋ชจ ์กฐ์ธ์— ์ ํ•ฉ (์ธ๋ฑ์Šค ์—†์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜)

outer ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์— ๋Œ€ํ•ด inner ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณตํ•ด์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ์กฐ์ธ ๋ฐฉ์‹

 

like ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ

for each row in OuterTable:
    for each row in InnerTable:
        if ์กฐ์ธ ์กฐ๊ฑด ๋งŒ์กฑ:
            ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

ํŠน์ง•

  • ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ 
  • ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ (์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ ๋ฒ”์œ„๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ)
  • ์ฒ˜๋ฆฌ๋Ÿ‰์€ Outer table ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ขŒ์šฐ 
  • ์ธ๋ฑ์Šค ๋ฐ˜๋ณต ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์ง
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ๊ทœ๋ชจ ์กฐ์ธ์— ์ ํ•ฉ 

 

Sort Merge Join

์ธ๋ฑ์Šค ์—†์ด ์กฐ์ธ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์–‘์ชฝ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ํด ๋•Œ. ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ๋งค์šฐ ์œ ๋ฆฌ 

์กฐ์ธ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–‘์ชฝ ํ…Œ์ด๋ธ”์„ ์ •๋ ฌํ•œ ๋‹ค์Œ, ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์กฐ์ธํ•˜๋Š” ๊ตฌ์กฐ. 
(์–‘์ชฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ → ๋‚˜๋ž€ํžˆ ๋น„๊ต → ์ผ์น˜ํ•˜๋ฉด ๋งค์นญํ•˜๋Š” ๋ฐฉ์‹) 

  • ๋™์‹œ ์ฒ˜๋ฆฌ (๋‘ ํ…Œ์ด๋ธ” ๋™์‹œ์— ์ „์ฒด ์Šค์บ”). 
  • ์ „์ฒด ๋ฒ”์œ„ ์ฒ˜๋ฆฌ
  • ์Šค์บ” ์•ก์„ธ์Šค ์œ„์ฃผ. 
  • ์กฐ์ธ ํ‚ค ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ์—†์–ด๋„ ๋จ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰์— ์œ ๋ฆฌ. 

* ํ•˜์ง€๋งŒ ์ •๋ ฌ ๋น„์šฉ์ด ํฌ๋ฏ€๋กœ, ์‚ฌ์ „์— ์ •๋ ฌ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๊ฐ€ ์ž˜ ์žกํ˜€ ์žˆ์œผ๋ฉด ์ข‹๋‹ค 

 

Hash Join

"์ž‘์€ ํ…Œ์ด๋ธ” + ํฐ ํ…Œ์ด๋ธ”" ๊ตฌ์กฐ์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, 
์ธ๋ฑ์Šค์™€ ์ •๋ ฌ์ด ํ•„์š” ์—†์Œ 

๋‘ ํ…Œ์ด๋ธ”์—์„œ ์กฐ์ธ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์‹œ (Hash) ๊ฐ’์„ ๋งŒ๋“ค์–ด,
์ด ํ•ด์‹œ ๊ฐ’์„ ์ด์šฉํ•ด ๋งค์นญ๋˜๋Š” ํ–‰์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„ ์กฐ์ธํ•˜๋Š” ๋ฐฉ์‹ 

  • ๊ฐ ํ…Œ์ด๋ธ”์„ 1๋ฒˆ๋งŒ ์ฝ์Œ 
  • ์ธ๋ฑ์Šค ์ •๋ ฌ ๋ถˆํ•„์š” 

 

 

๐Ÿ“ ์กฐ์ธ์ด์™ธ์˜ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ• 

1. ์—ฐ์‚ฐ์ž

  • UNION (ํ•ฉ์ง‘ํ•ฉ)
  • UNION ALL (ํ•ฉ์ง‘ํ•ฉ ์ค‘๋ณต) 
  • INTERSECT (๊ต์ง‘ํ•ฉ)
  • MINUS (์ฐจ์ง‘ํ•ฉ) 

 

2. ์„œ๋ธŒ์ฟผ๋ฆฌ (Sub-query)

: ์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€, SQL์—์„œ ์ฟผ๋ฆฌ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฅด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ 

 

์„œ๋ธŒ์ฟผ๋ฆฌ ์œ ํ˜• 

  • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (scalar subquery) 
    • `select column..., (select)` 
    • ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์ฒ˜๋Ÿผ ์‚ฌ์šฉ, ๊ฐ„๊ฒฐํ•œ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ํšจ๊ณผ 
  • ์ธ๋ผ์ธ ๋ทฐ (Inline View) 
    • `from (select ...)`
    • ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์‚ฌ์šฉ, ๋ชจ๋ธ๋ง ๋Œ€์ƒ ์•„๋‹Œ ์ž„์‹œ ํ…Œ์ด๋ธ” ๋“ฑ 
  • ์ผ๋ฐ˜ ์„œ๋ธŒ์ฟผ๋ฆฌ
    • `where column = (select ...)`
    • ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜ (์ƒ์ˆ˜)์ฒ˜๋Ÿผ ์‚ฌ์šฉ, ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์กฐ๊ฑด์ ˆ ๋ณ€๊ฒฝ 

 

์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (Scalar SubQuery) 

`SELECT` ์ ˆ์— ์“ฐ์ด๋ฉฐ, ํ•œ ํ–‰ ํ•œ ์ปฌ๋Ÿผ(๋‹จ์ผ๊ฐ’)๋งŒ ๋ฐ˜ํ™˜ (๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ), 
๋ฐ˜๋ณต ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ,
JOIN, IN-LINE VIEW๋กœ ๋ฐ”๊พธ๋Š” ํŠœ๋‹ ํ•„์š” 
  • ์ž‘๋™ ๋ฐฉ์‹
    • 1. ๋ฉ”์ธ ์ฟผ๋ฆฌ๊ฐ€ ๋จผ์ € ์‹คํ–‰
    • 2. ๊ฐ ํ–‰๋งˆ๋‹ค ์„œ๋ธŒ์ฟผ๋ฆฌ ์‹คํ–‰ → ๋ฐ˜๋ณต ์‹คํ–‰
    • 3. ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ฉ”์ธ ํ–‰๊ณผ ์—ฐ๊ฒฐ 
  • ํŠน์ง• ๋ฐ ์ฃผ์˜์‚ฌํ•ญ
    • 1๊ฐœ ์ปฌ๋Ÿผ๋งŒ ๋ฐ˜ํ™˜ : SELECT์ ˆ ๋˜๋Š” ์กฐ๊ฑด์ ˆ์—์„œ ๋‹จ์ผ ๊ฐ’์ฒ˜๋Ÿผ ์‚ฌ์šฉ 
    • ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ์บ์‹ฑ๋จ : ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋ฉด ๋‹ค์‹œ ์•ก์„ธ์Šค ์•ˆํ•จ 
    • ๋‹ค๋ฅด๋ฉด ์„ฑ๋Šฅ ์˜ํ–ฅ ํผ : ๋ฉ”์ธ ์ง‘ํ•ฉ์˜ row ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต ์‹คํ–‰๋จ 
    • ์‘๋‹ต์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ : ๋ฉ”์ธ ์ง‘ํ•ฉ์ด ํฌ๋ฉด ์„ฑ๋Šฅ ๊ธ‰๋ฝ 
  • ์„ฑ๋Šฅ ํŠœ๋‹ ํŒ
    • `LEFT JOIN`, ๋˜๋Š” `INLINE VIEW (์ธ๋ผ์ธ ๋ทฐ)`๋กœ ๋ฐ”๊พธ๋ฉด ํ›จ์”ฌ ๋นจ๋ผ์ง
    • ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์ˆ˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋งค๋ฒˆ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ’์„ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋ณต ์‹คํ–‰์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ฃผ์˜ ํ•„์š” 
๊ทธ๋Ÿผ ํ•ญ์ƒ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค JOIN์ด๋‚˜ VIEW ๋ฐฉ์‹์ด ๋น ๋ฅผ๊นŒ?

ํ•ญ์ƒ ๊ทธ๋ ‡์ง„ ์•Š๋‹ค!
์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์†Œ๊ทœ๋ชจ๋ผ๋ฉด, ์Šค์นผ๋Ÿฌ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์˜คํžˆ๋ ค ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค

๋”ฐ๋ผ์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, ์ธ๋ฑ์Šค, ์ง‘ํ•ฉ ํฌ๊ธฐ, ์บ์‹œ ๊ฐ€๋Šฅ์„ฑ ๋“ฑ์„ ๊ณ ๋ คํ•œ ํŠœ๋‹์ด ํ•„์š”ํ•˜๋‹ค

 

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ํ‚ค์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์ธ์ง€?
: SQL ์„ฑ๋Šฅ ์ตœ์ ํ™”์—์„œ ํ‚ค(๊ธฐ๋ณธํ‚ค PK, ์™ธ๋ž˜ํ‚ค FK)์˜ ์—ญํ•  

ํ‚ค๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ `๋ฐ์ดํ„ฐ์˜ ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•`ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค 

ํ‚ค ์œ ํ˜• ์˜๋ฏธ 
๊ธฐ๋ณธํ‚ค(PK) ์ด ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์ปฌ๋Ÿผ์€ ์ ˆ๋Œ€ ์ค‘๋ณต์ด ์—†๋‹ค (๊ณ ์œ ์„ฑ ๋ณด์žฅ)
์™ธ๋ž˜ํ‚ค(FK) ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ (๊ด€๊ณ„ ๋ช…์‹œ)

 

์œ„์ฒ˜๋Ÿผ ๊ธฐ๋ณธํ‚ค์™€ ์™ธ๋ž˜ํ‚ค๊ฐ€ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์„ ๋•Œ, 
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ‚ค ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ `์˜ˆ์ธก`๊ณผ `์ตœ์ ํ™”`๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค!

 

  • ํ‚ค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
    • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์กฐ์ธ `EMP.DEPTNO → DEPT.DEPTNO` ์‹์œผ๋กœ ์—ฐ๊ฒฐ๋  ๋•Œ ๋ฌด์กฐ๊ฑด 1:1 ๋งค์นญ์ž„์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ
  • ํ‚ค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ 
    • ์กฐ์ธ์ด 1:1์ธ์ง€, 1:N์ธ์ง€, N:N์ธ์ง€ ๋ชจ๋ฆ„ 
    • ๋”ฐ๋ผ์„œ, ์ •ํ™•ํ•œ ์‹คํ–‰ ๊ณ„ํš์„ ์„ธ์šฐ๊ธฐ ์–ด๋ ค์›Œ์ง 
PK/FK๋Š” ๋‹จ์ˆœํžˆ ์ œ์•ฝ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ผ, 
์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•Œ๋ ค์ฃผ๋Š” ํžŒํŠธ์ด์ž ์•ฝ์†!

 

3. ํ•จ์ˆ˜ 

  • ํ•จ์ˆ˜๋Š” ํŠน์ • ์—ฐ์‚ฐ์ด๋‚˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” SQL ๋‚ด์žฅ ๊ธฐ๋Šฅ 
  • ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ์ง‘๊ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

* ํ•จ์ˆ˜ ์˜ˆ์‹œ 

delimiter $$

create function `fn_ename`(v_empno int(4))  
returns varchar(10) charset utf8mb4 COLLATE utf8mb4_general_ci
begin
    declare v_ename varchar(10);
    set v_ename = (select ENAME from EMP where EMPNO = v_empno);
    return v_ename;
end $$

delimiter ;

 

ํŠธ๋ฆฌ๊ฑฐ์™€ ํ”„๋กœ์‹œ์ € 

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ €์žฅํ˜• ํ”„๋กœ๊ทธ๋žจ 

  ํŠธ๋ฆฌ๊ฑฐ (Trigger) ํ”„๋กœ์‹œ์ € (Procedure) 
์ •์˜ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ž๋™ ์‹คํ–‰ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ
ํ˜ธ์ถœ ์‹œ์  INSERT, UPDATE, DELETE ๋“ฑ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ CALL ํ”„๋กœ์‹œ์ €๋ช…(...) ๋ช…๋ น์œผ๋กœ ์‹คํ–‰
์šฉ๋„ ๋ฌด์กฐ๊ฑด์„ฑ ์ž๋™ ์ฒ˜๋ฆฌ (๊ฐ์‹œ/๊ธฐ๋ก/๊ฒ€์‚ฌ ๋“ฑ) ๋ช…๋ น์–ด ๋ฌถ์Œ ์‹คํ–‰ (๋ณต์žก ๋กœ์ง ์ฒ˜๋ฆฌ)
ํ˜ธ์ถœ ์ฃผ์ฒด DBMS ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜ ํ๋ฆ„ ์‚ฌ์šฉ์ž ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
๋Œ€ํ‘œ ๊ธฐ๋Šฅ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€, ์ž๋™ ๋กœ๊ทธ, ๊ฐ์‚ฌ, ์•Œ๋ฆผ ๋ฐ˜๋ณต ์ž‘์—…, ๋ฐฐ์น˜, ์กฐ๊ฑด ๋ถ„๊ธฐ, ๋™์  ๋กœ์ง

 

๊ทธ๋Ÿผ ํ•จ์ˆ˜์™€ ํ”„๋กœ์‹œ์ €์˜ ์ฐจ์ด?

  • ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  • ํ”„๋กœ์‹œ์ €๋Š” ์ž‘์—… ์ง€์‹œ์„œ์ฒ˜๋Ÿผ ๋ช…๋ น์–ด ๋ฌถ์Œ์„ ์‹คํ–‰ (๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ธฐ๋ณด๋‹ค๋Š” ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค!)

 

์ธ๋ฑ์Šค์™€ PK, FK์˜ ์ฐจ์ด๊ฐ€ ๋„๋Œ€์ฒด ๋ญ์•ผ~!?

3๊ฐœ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์„ฑ๋Šฅ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ

  • PK = ์ œ์•ฝ ์กฐ๊ฑด + ์ธ๋ฑ์Šค (์ž๋™)
  • FK = ์ œ์•ฝ ์กฐ๊ฑด (์ฐธ์กฐ ๊ด€๊ณ„), ์„ฑ๋Šฅ ์œ„ํ•ด ์ธ๋ฑ์Šค ๋”ฐ๋กœ ์ƒ์„ฑ ํ•„์š”
  • INDEX = ์ œ์•ฝ ์—†์Œ, ์ˆœ์ˆ˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋„๊ตฌ

 

๊ทธ๋Ÿผ ID์™€ Index์™€ ์ฐจ์ด๊ฐ€ ๋ญ์•ผ~!?
  • ID๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ ์ •์˜ํ•œ ์นผ๋Ÿผ์œผ๋กœ, ๋ ˆ์ฝ”๋“œ ์‹๋ณ„์šฉ (PK ํ›„๋ณด)
  • Index๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ปฌ๋Ÿผ์ด ์•„๋‹ˆ๋ฉฐ, DB ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ 

 

 

๐Ÿ“ SQL ํŠœ๋‹ (SQL Optimization)

SQL ์„ฑ์ฆ์„ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ์š”์†Œ (SQL ์ตœ์ ํ™” ๋Œ€์ƒ)

  • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ 
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์กฐํšŒ ์†๋„๊ฐ€ ๋А๋ ค์ง
  • ์กฐ์ธ์˜ ํšจ์œจ์„ฑ
    • ๋ถˆํ•„์š”ํ•œ JOIN์„ ์ค„์ด๊ณ , ์ ์ ˆํ•จ INDEX๋ฅผ ์‚ฌ์šฉ 
  • ์ธ๋ฑ์Šค (Index) ํ™œ์šฉ
    • ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ 
  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ
    • SELECT * ๋Œ€์‹  ํ•„์š”ํ•œ ์นผ๋Ÿผ๋งŒ ์กฐํšŒ 
  • ์„œ๋ธŒ์ฟผ๋ฆฌ vs ์กฐ์ธ 
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋А๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์กฐ์ธ์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ 

 

SQL ํŠœ๋‹ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

1. `SELECT *` ๋Œ€์‹  ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒ

2. ์„œ๋ธŒ์ฟผ๋ฆฌ ๋Œ€์‹  `JOIN` ์‚ฌ์šฉ

3. OR ๋Œ€์‹  `UNION` ํ™œ์šฉ 

4. `์ธ๋ฑ์Šค`๋ฅผ ํ™œ์šฉํ•ด ๊ฒ€์ƒ‰ ์†๋„ ์ตœ์ ํ™” 

5. COUNT(*) ๋Œ€์‹  `COUNT(์ปฌ๋Ÿผ)` ์‚ฌ์šฉ 

 

 

'IT > SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[MySQL] ๊ธฐ๋ณธ SQL ๋ฌธ๋ฒ• ์ด์ •๋ฆฌ & ๋ชจ์Œ  (0) 2025.03.23
Copy