Lesson 08: ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ(Query Processing)

Lesson 08: ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ(Query Processing)

์ด์ „: 07_Advanced_Normalization.md | ๋‹ค์Œ: 09_Indexing.md


์ฃผ์ œ(Topic): Database Theory ๋ ˆ์Šจ(Lesson): 8 of 16 ์„ ํ–‰ ํ•™์Šต(Prerequisites): ๊ด€๊ณ„ ๋Œ€์ˆ˜(Relational algebra, Lesson 03), SQL ๊ธฐ์ดˆ, ๋””์Šคํฌ I/O ์ดํ•ด ๋ชฉํ‘œ(Objective): DBMS๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ํšจ์œจ์ ์ธ ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ณ , ์„ ํƒ(selection)๊ณผ ์กฐ์ธ(join) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋น„์šฉ ๋ชจ๋ธ์„ ์ˆ™๋‹ฌํ•˜๋ฉฐ, ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค

1. ์†Œ๊ฐœ(Introduction)

SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ž‘์„ฑ๋œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SQL ๋ฌธ๊ณผ ์‹ค์ œ ๋””์Šคํฌ ์•ก์„ธ์Šค ์‚ฌ์ด์—๋Š” ํŒŒ์‹ฑ(parsing), ์ตœ์ ํ™”(optimization), ์‹คํ–‰(execution)์˜ ์ •๊ตํ•œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

1.1 ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ(The Query Processing Pipeline)

SQL Query
    โ”‚
    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚    Parser        โ”‚ โ†’ ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ, ํŒŒ์Šค ํŠธ๋ฆฌ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Translator      โ”‚ โ†’ ๊ด€๊ณ„ ๋Œ€์ˆ˜ ํ‘œํ˜„์‹
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Optimizer       โ”‚ โ†’ ์ตœ์„ ์˜ ์‹คํ–‰ ๊ณ„ํš ์„ ํƒ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Execution       โ”‚ โ†’ ๊ณ„ํš ์‹คํ–‰, ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
โ”‚  Engine          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.2 ์˜ˆ์ œ: ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ์˜ ์—ฌ์ •(Example: A Simple Query's Journey)

SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > 80000;
  1. ํŒŒ์„œ(Parser): ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ, ํ…Œ์ด๋ธ”/์—ด ์ด๋ฆ„ ํ•ด์„, ํŒŒ์Šค ํŠธ๋ฆฌ ์ƒ์„ฑ
  2. ๋ณ€ํ™˜๊ธฐ(Translator): ๊ด€๊ณ„ ๋Œ€์ˆ˜๋กœ ๋ณ€ํ™˜: ฯ€_{name, dept_name}(ฯƒ_{salary > 80000}(employees โ‹ˆ_{dept_id} departments))
  3. ์ตœ์ ํ™”๊ธฐ(Optimizer): ๋งŽ์€ ๋™๋“ฑํ•œ ๊ณ„ํš์„ ๊ณ ๋ ค:
  4. ๋จผ์ € ํ•„ํ„ฐ๋ง ํ›„ ์กฐ์ธ? ์•„๋‹ˆ๋ฉด ๋จผ์ € ์กฐ์ธ ํ›„ ํ•„ํ„ฐ๋ง?
  5. salary์— ์ธ๋ฑ์Šค ์‚ฌ์šฉ? dept_id์—?
  6. ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ? ํ•ด์‹œ ์กฐ์ธ? ์ •๋ ฌ-๋ณ‘ํ•ฉ ์กฐ์ธ?
  7. ์‹คํ–‰ ์—”์ง„(Execution engine): ๋ฐ˜๋ณต์ž ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ๋œ ๊ณ„ํš ์‹คํ–‰

2. ํŒŒ์‹ฑ๊ณผ ๋ณ€ํ™˜(Parsing and Translation)

2.1 ํŒŒ์‹ฑ(Parsing)

ํŒŒ์„œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ์–ดํœ˜ ๋ถ„์„(Lexical analysis): ์ฟผ๋ฆฌ๋ฅผ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ด (ํ‚ค์›Œ๋“œ, ์‹๋ณ„์ž, ์—ฐ์‚ฐ์ž, ๋ฆฌํ„ฐ๋Ÿด)
  2. ๊ตฌ๋ฌธ ๋ถ„์„(Syntax analysis): ์ฟผ๋ฆฌ๊ฐ€ SQL ๋ฌธ๋ฒ• ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š”์ง€ ํ™•์ธ, ํŒŒ์Šค ํŠธ๋ฆฌ ์ƒ์„ฑ
  3. ์˜๋ฏธ ๋ถ„์„(Semantic analysis): ํ…Œ์ด๋ธ”๊ณผ ์—ด์ด ์กด์žฌํ•˜๋Š”์ง€, ํƒ€์ž…์ด ํ˜ธํ™˜๋˜๋Š”์ง€, ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋Š”์ง€ ํ™•์ธ

ํŒŒ์Šค ํŠธ๋ฆฌ (์šฐ๋ฆฌ ์˜ˆ์ œ):

         SELECT
        /      \
   ProjectList  FROM
   /      \      |
 e.name  d.dept_name  JoinClause
                        /    \
                  employees  departments
                       |
                  ON e.dept_id = d.dept_id
                       |
                  WHERE e.salary > 80000

2.2 ๊ด€๊ณ„ ๋Œ€์ˆ˜๋กœ ๋ณ€ํ™˜(Translation to Relational Algebra)

ํŒŒ์„œ ์ถœ๋ ฅ์€ ์ดˆ๊ธฐ ๊ด€๊ณ„ ๋Œ€์ˆ˜ ํ‘œํ˜„์‹ (๋˜๋Š” ์ฟผ๋ฆฌ ํŠธ๋ฆฌ(query tree)๋ผ๊ณ  ํ•˜๋Š” ๋™๋“ฑํ•œ ๋‚ด๋ถ€ ํ‘œํ˜„)์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค:

ฯ€_{name, dept_name}
    โ”‚
    ฯƒ_{salary > 80000}
    โ”‚
    โ‹ˆ_{dept_id}
   / \
  e   d

์ด ์ดˆ๊ธฐ ํ‘œํ˜„์‹์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ •ํ™•ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํšจ์œจ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๊ธฐ์˜ ์—ญํ• ์€ ๋™๋“ฑํ•˜์ง€๋งŒ ๋” ๋น ๋ฅธ ๊ณ„ํš์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


3. ์ฟผ๋ฆฌ ํ‰๊ฐ€ ๊ณ„ํš๊ณผ ๋ฐ˜๋ณต์ž ๋ชจ๋ธ(Query Evaluation Plans and the Iterator Model)

3.1 ์ฟผ๋ฆฌ ํ‰๊ฐ€ ๊ณ„ํš(Query Evaluation Plan)

์ฟผ๋ฆฌ ํ‰๊ฐ€ ๊ณ„ํš(query evaluation plan) (๋˜๋Š” ์‹คํ–‰ ๊ณ„ํš)์€ ๋‹ค์Œ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค: - ์ˆ˜ํ–‰ํ•  ๊ด€๊ณ„ ๋Œ€์ˆ˜ ์—ฐ์‚ฐ - ๊ฐ ์—ฐ์‚ฐ์— ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ - ์—ฐ์‚ฐ ๊ฐ„ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐฉ์‹

3.2 ๋ฐ˜๋ณต์ž(Volcano/Pipeline) ๋ชจ๋ธ(The Iterator (Volcano/Pipeline) Model)

๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ˜๋ณต์ž ๋ชจ๋ธ(iterator model) (Goetz Graefe์˜ Volcano ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋”ฐ์™€ Volcano ๋ชจ๋ธ์ด๋ผ๊ณ ๋„ ํ•จ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

๋ชจ๋“  ์—ฐ์‚ฐ์ž๋Š” ์„ธ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค:

open()   โ†’ ์—ฐ์‚ฐ์ž ์ดˆ๊ธฐํ™”. ์ž์‹ ๋ฐ˜๋ณต์ž ์—ด๊ธฐ, ๋ฒ„ํผ ํ• ๋‹น.
next()   โ†’ ๊ฒฐ๊ณผ์˜ ๋‹ค์Œ ํŠœํ”Œ ๋ฐ˜ํ™˜. ํ•„์š”์— ๋”ฐ๋ผ ์ž์‹์˜ next() ํ˜ธ์ถœ.
close()  โ†’ ์ •๋ฆฌ. ๋ฒ„ํผ ํ•ด์ œ, ์ž์‹ ๋ฐ˜๋ณต์ž ๋‹ซ๊ธฐ.

ํ•ต์‹ฌ ํ†ต์ฐฐ: ์—ฐ์‚ฐ์ž๋“ค์ด ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ๊ฐ€ next()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์ด๊ฒƒ์ด ๋ฆฌํ”„(ํ…Œ์ด๋ธ” ์Šค์บ”)๊นŒ์ง€ ๊ณ„๋‹จ์‹์œผ๋กœ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค. ํŠœํ”Œ๋“ค์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์œ„๋กœ ํ๋ฆ…๋‹ˆ๋‹ค.

         ฯ€_{name, dept_name}     โ† ๋ฃจํŠธ๊ฐ€ next() ํ˜ธ์ถœ
              โ”‚
         ฯƒ_{salary > 80000}     โ† ํ•„ํ„ฐ๋ง, ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ์„ ์œ„๋กœ ์ „๋‹ฌ
              โ”‚
         โ‹ˆ_{dept_id}            โ† ์กฐ์ธ๋œ ํŠœํ”Œ ์ƒ์„ฑ
            / \
      Scan(e)  Scan(d)          โ† ๋””์Šคํฌ์—์„œ ํŠœํ”Œ ์ฝ๊ธฐ

3.3 ๊ตฌ์ฒดํ™” vs ํŒŒ์ดํ”„๋ผ์ด๋‹(Materialization vs Pipelining)

๊ตฌ์ฒดํ™”(Materialization): ๊ฐ ์—ฐ์‚ฐ์ž๊ฐ€ ์ „์ฒด ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž„์‹œ ๋ฆด๋ ˆ์ด์…˜์— ์ €์žฅํ•œ ๋‹ค์Œ ๋ถ€๋ชจ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋งŽ์€ ์ž„์‹œ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ด๋‹(Pipelining): ํŠœํ”Œ๋“ค์ด ์™„์ „ํžˆ ๊ตฌ์ฒดํ™”๋˜์ง€ ์•Š๊ณ  ์—ฐ์‚ฐ์ž๋“ค์„ ํ†ตํ•ด ํ๋ฆ…๋‹ˆ๋‹ค. ํ•œ ํŠœํ”Œ์ด ์ƒ์„ฑ๋˜์ž๋งˆ์ž ๋‹ค์Œ ์—ฐ์‚ฐ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๊ตฌ์ฒดํ™”:
  Scan(e) โ†’ [์ „์ฒด ์ž„์‹œ ํ…Œ์ด๋ธ”] โ†’ ฯƒ โ†’ [์ „์ฒด ์ž„์‹œ ํ…Œ์ด๋ธ”] โ†’ โ‹ˆ โ†’ [์ „์ฒด ์ž„์‹œ ํ…Œ์ด๋ธ”] โ†’ ฯ€

ํŒŒ์ดํ”„๋ผ์ด๋‹:
  Scan(e) โ†’ ฯƒ โ†’ โ‹ˆ โ†’ ฯ€
  (ํŠœํ”Œ๋ณ„๋กœ, ์ „์ฒด ์ž„์‹œ ํ…Œ์ด๋ธ” ์—†์Œ)

ํŒŒ์ดํ”„๋ผ์ด๋‹์ด ์„ ํ˜ธ๋˜์ง€๋งŒ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์—ฐ์‚ฐ์€ ๋ธ”๋กœํ‚น(blocking)์ž…๋‹ˆ๋‹ค โ€” ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ์ž…๋ ฅ์„ ์†Œ๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: - ์ •๋ ฌ(Sorting) (์ •๋ ฌํ•˜๋ ค๋ฉด ๋ชจ๋“  ํŠœํ”Œ์„ ๋ด์•ผ ํ•จ) - ํ•ด์‹œ ์กฐ์ธ ๋นŒ๋“œ ๋‹จ๊ณ„(Hash join build phase) (์ „์ฒด ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋นŒ๋“œํ•ด์•ผ ํ•จ) - ์ง‘๊ณ„(Aggregation) (๋ชจ๋“  ๊ทธ๋ฃน์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ)

3.4 ํ’€ vs ํ‘ธ์‹œ ๋ชจ๋ธ(Pull vs Push Model)

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐ˜๋ณต์ž ๋ชจ๋ธ์€ ํ’€(pull) ๋ชจ๋ธ (๋˜๋Š” ์ˆ˜์š” ์ฃผ๋„)์ž…๋‹ˆ๋‹ค: ๋ถ€๋ชจ๊ฐ€ next()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž์‹์œผ๋กœ๋ถ€ํ„ฐ ํŠœํ”Œ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

ํ˜„๋Œ€ ์‹œ์Šคํ…œ์€ ์ ์  ๋” ํ‘ธ์‹œ(push) ๋ชจ๋ธ (๋˜๋Š” ๋ฐ์ดํ„ฐ ์ฃผ๋„)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: ์ž์‹์ด ๋ถ€๋ชจ์—๊ฒŒ ํŠœํ”Œ์„ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋” ์บ์‹œ ์นœํ™”์ ์ด๊ณ  ์ปดํŒŒ์ผ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€ (Volcano):                    ํ‘ธ์‹œ:
  ๋ถ€๋ชจ๊ฐ€ child.next() ํ˜ธ์ถœ          ์ž์‹์ด parent.consume(tuple) ํ˜ธ์ถœ
  ์ž์‹์ด ํ•˜๋‚˜์˜ ํŠœํ”Œ ๋ฐ˜ํ™˜            ๋ถ€๋ชจ๊ฐ€ ์ฆ‰์‹œ ์ฒ˜๋ฆฌ
  ๋ถ€๋ชจ๊ฐ€ ์ฒ˜๋ฆฌ                       ๋” ์บ์‹œ ์นœํ™”์ 

์ผ๋ถ€ ์‹œ์Šคํ…œ (์˜ˆ: HyPer, Umbra)์€ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์‚ฐ์ž๋“ค์„ ํ†ตํ•ด ํ‘ธ์‹œํ•˜๋Š” ํƒ€์ดํŠธํ•œ ๋ฃจํ”„๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ๊ฑฐ์˜ ์†์œผ๋กœ ์ฝ”๋”ฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.


4. ๋น„์šฉ ์ถ”์ •(Cost Estimation)

4.1 ๋น„์šฉ ์ง€ํ‘œ(Cost Metrics)

์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์˜ ์ฃผ์š” ๋น„์šฉ:

๋น„์šฉ ๊ตฌ์„ฑ ์š”์†Œ ๊ธฐํ˜ธ ์„ค๋ช…
๋””์Šคํฌ I/O tT, tS ์ „์†ก ์‹œ๊ฐ„(์ˆœ์ฐจ ์ฝ๊ธฐ)๊ณผ ํƒ์ƒ‰ ์‹œ๊ฐ„
CPU โ€” ๋น„๊ต, ํ•ด์‹ฑ, ๊ณ„์‚ฐ
๋ฉ”๋ชจ๋ฆฌ M ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„ํผ ํŽ˜์ด์ง€
๋„คํŠธ์›Œํฌ โ€” ๋ถ„์‚ฐ ์ฟผ๋ฆฌ์šฉ

์ „ํ†ต์  ์‹œ์Šคํ…œ์—์„œ๋Š” ๋””์Šคํฌ I/O๊ฐ€ ์ง€๋ฐฐ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””์Šคํฌ์˜ ๊ฒฝ์šฐ: - ํƒ์ƒ‰ ์‹œ๊ฐ„(Seek time, tS) โ‰ˆ 4 ms - ๋ธ”๋ก๋‹น ์ „์†ก ์‹œ๊ฐ„(Transfer time per block, tT) โ‰ˆ 0.1 ms

๋‹จ์ผ ๋žœ๋ค I/O๋Š” ~4.1 ms๊ฐ€ ์†Œ์š”๋˜๋Š” ๋ฐ˜๋ฉด, ์ˆœ์ฐจ ์ฝ๊ธฐ๋Š” ๋ธ”๋ก๋‹น ~0.1 ms๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์ด 40:1 ๋น„์œจ์€ ์ˆœ์ฐจ ์•ก์„ธ์Šค ํŒจํ„ด์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

4.2 ํ‘œ๊ธฐ๋ฒ•(Notation)

๊ธฐํ˜ธ ์˜๋ฏธ
n_r ๋ฆด๋ ˆ์ด์…˜ r์˜ ํŠœํ”Œ ์ˆ˜
b_r r์˜ ํŠœํ”Œ์„ ํฌํ•จํ•˜๋Š” ๋””์Šคํฌ ๋ธ”๋ก ์ˆ˜
l_r r์˜ ํŠœํ”Œ ํฌ๊ธฐ(๋ฐ”์ดํŠธ)
f_r ๋ธ”๋กœํ‚น ํŒฉํ„ฐ: ๋ธ”๋ก๋‹น ํŠœํ”Œ = โŒŠB / l_rโŒ‹
B ๋ธ”๋ก(ํŽ˜์ด์ง€) ํฌ๊ธฐ(๋ฐ”์ดํŠธ)
V(A, r) r์˜ ์†์„ฑ A์˜ ๊ณ ์œ  ๊ฐ’ ์ˆ˜
M ๋ฉ”๋ชจ๋ฆฌ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„ํผ ํŽ˜์ด์ง€ ์ˆ˜

๊ด€๊ณ„: b_r = โŒˆn_r / f_rโŒ‰

4.3 ์˜ˆ์ œ ์นดํƒˆ๋กœ๊ทธ ํ†ต๊ณ„(Example Catalog Statistics)

employees (e):
    n_e = 10,000 ํŠœํ”Œ
    l_e = 200 ๋ฐ”์ดํŠธ
    B   = 4,096 ๋ฐ”์ดํŠธ (4 KB ํŽ˜์ด์ง€)
    f_e = โŒŠ4096 / 200โŒ‹ = 20 ํŠœํ”Œ/๋ธ”๋ก
    b_e = โŒˆ10000 / 20โŒ‰ = 500 ๋ธ”๋ก
    V(dept_id, e) = 50 ๊ณ ์œ  ๋ถ€์„œ
    V(salary, e) = 2,000 ๊ณ ์œ  ๊ธ‰์—ฌ ๊ฐ’

departments (d):
    n_d = 50 ํŠœํ”Œ
    l_d = 100 ๋ฐ”์ดํŠธ
    f_d = โŒŠ4096 / 100โŒ‹ = 40 ํŠœํ”Œ/๋ธ”๋ก
    b_d = โŒˆ50 / 40โŒ‰ = 2 ๋ธ”๋ก

5. ์„ ํƒ ๊ตฌํ˜„(Selection Implementation)

์„ ํƒ(Selection, ฯƒ)์€ ์ˆ ์–ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํŠœํ”Œ์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์ „๋žต์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

5.1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ A1: ์„ ํ˜• ์Šค์บ”(์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”) (Linear Scan (Full Table Scan))

๋ฆด๋ ˆ์ด์…˜์˜ ๋ชจ๋“  ๋ธ”๋ก์„ ์Šค์บ”ํ•˜์—ฌ ๊ฐ ํŠœํ”Œ์„ ์ˆ ์–ด์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

ALGORITHM: LinearScan(r, predicate)
FOR EACH block b in r DO
    FOR EACH tuple t in b DO
        IF t satisfies predicate THEN
            output t
        END IF
    END FOR
END FOR

๋น„์šฉ: b_r ๋ธ”๋ก ์ „์†ก + 1 ํƒ์ƒ‰

์šฐ๋ฆฌ ์˜ˆ์ œ: 500 ์ „์†ก + 1 ํƒ์ƒ‰ = 500 ร— 0.1ms + 4ms = 54 ms

์‚ฌ์šฉ ์‹œ๊ธฐ: ํ•ญ์ƒ ์ ์šฉ ๊ฐ€๋Šฅ. ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์„ ํƒ๋„๊ฐ€ ๋งค์šฐ ๋‚ฎ์„ ๋•Œ (๋Œ€๋ถ€๋ถ„์˜ ํŠœํ”Œ์ด ์ž๊ฒฉ) ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์ด ์„ ํƒ ์†์„ฑ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ณ  ์ˆ ์–ด๊ฐ€ ๋™๋“ฑ ์กฐ๊ฑด์ด๋ฉด:

ALGORITHM: BinarySearch(r, A = v)
์ด์ง„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ A = v๋ฅผ ํฌํ•จํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก ์ฐพ๊ธฐ
์•ž์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ๋ชจ๋“  ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ ์ฐพ๊ธฐ

๋น„์šฉ: ๊ฒ€์ƒ‰์„ ์œ„ํ•œ โŒˆlogโ‚‚(b_r)โŒ‰ ํƒ์ƒ‰ ๋ฐ ์ „์†ก + ์ค‘๋ณต ๊ฐ’์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๋ธ”๋ก

ํ‚ค์— ๋Œ€ํ•œ ๋™๋“ฑ ์กฐ๊ฑด: โŒˆlogโ‚‚(500)โŒ‰ = 9 ๋ธ”๋ก ์•ก์„ธ์Šค = 9 ร— (4ms + 0.1ms) = 37 ms

5.3 ์•Œ๊ณ ๋ฆฌ์ฆ˜ A3: ๊ธฐ๋ณธ ์ธ๋ฑ์Šค, ํ‚ค์— ๋Œ€ํ•œ ๋™๋“ฑ ์กฐ๊ฑด(Primary Index, Equality on Key)

์„ ํƒ ์†์„ฑ (ํ‚ค์ธ)์— ๊ธฐ๋ณธ Bโบ-ํŠธ๋ฆฌ ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉด:

๋น„์šฉ = (h_i + 1) ร— (tS + tT)

์—ฌ๊ธฐ์„œ h_i๋Š” Bโบ-ํŠธ๋ฆฌ์˜ ๋†’์ด (์ผ๋ฐ˜์ ์œผ๋กœ 2-4).

h_i = 3์ธ ๊ฒฝ์šฐ: 4 ร— 4.1ms = 16.4 ms (3 ์ธ๋ฑ์Šค ๋ ˆ๋ฒจ + 1 ๋ฐ์ดํ„ฐ ๋ธ”๋ก)

5.4 ์•Œ๊ณ ๋ฆฌ์ฆ˜ A4: ๊ธฐ๋ณธ ์ธ๋ฑ์Šค, ๋น„ํ‚ค์— ๋Œ€ํ•œ ๋™๋“ฑ ์กฐ๊ฑด(Primary Index, Equality on Non-Key)

์—ฌ๋Ÿฌ ํŠœํ”Œ์ด ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์—ฐ์†์ ์ž…๋‹ˆ๋‹ค (ํŒŒ์ผ์ด ์ด ์†์„ฑ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ):

๋น„์šฉ = h_i ร— (tS + tT) + tS + tT ร— b

์—ฌ๊ธฐ์„œ b๋Š” ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ์„ ํฌํ•จํ•˜๋Š” ๋ธ”๋ก ์ˆ˜์ž…๋‹ˆ๋‹ค.

5.5 ์•Œ๊ณ ๋ฆฌ์ฆ˜ A5: ๋ณด์กฐ ์ธ๋ฑ์Šค, ๋™๋“ฑ ์กฐ๊ฑด(Secondary Index, Equality)

ํ›„๋ณด ํ‚ค์— ๋Œ€ํ•ด (์ตœ๋Œ€ ํ•˜๋‚˜์˜ ์ผ์น˜):

๋น„์šฉ = (h_i + 1) ร— (tS + tT)

ํ‚ค ์†์„ฑ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ธ๋ฑ์Šค์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋น„ํ‚ค ์†์„ฑ์— ๋Œ€ํ•ด (์—ฌ๋Ÿฌ ์ผ์น˜):

๋น„์šฉ = (h_i + n) ร— (tS + tT)

์—ฌ๊ธฐ์„œ n์€ ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฐ ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ์€ ๋‹ค๋ฅธ ๋ธ”๋ก์— ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ (๊ธฐ๋ณธ ์ธ๋ฑ์Šค์ฒ˜๋Ÿผ ์—ฐ์†์ ์ด์ง€ ์•Š์Œ), ๊ฐ๊ฐ ๋ณ„๋„์˜ ํƒ์ƒ‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋‚ฎ์€ ์„ ํƒ๋„ ์ˆ ์–ด์— ๋Œ€ํ•ด ๋งค์šฐ ๋น„์Œ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. n = 500์ด๋ฉด, ๋น„์šฉ์€ (3 + 500) ร— 4.1ms = 2,062 ms โ€” ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ” (54 ms)๋ณด๋‹ค ํ›จ์”ฌ ๋‚˜์ฉ๋‹ˆ๋‹ค!

5.6 ๋ฒ”์œ„ ์ˆ ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์„ ํƒ(Selection with Range Predicates)

salary > 80000์™€ ๊ฐ™์€ ์ˆ ์–ด์˜ ๊ฒฝ์šฐ:

๋ฐฉ๋ฒ• ๋น„์šฉ
์„ ํ˜• ์Šค์บ” b_r (ํ•ญ์ƒ ์ž‘๋™)
๊ธฐ๋ณธ ์ธ๋ฑ์Šค (Bโบ-ํŠธ๋ฆฌ) h_i + b/2 (ํ‰๊ท ์ ์œผ๋กœ ๋ฆฌํ”„ ๋ ˆ๋ฒจ์˜ ์ ˆ๋ฐ˜ ์Šค์บ”)
๋ณด์กฐ ์ธ๋ฑ์Šค (Bโบ-ํŠธ๋ฆฌ) h_i + ๋ฒ”์œ„์˜ ๋ฆฌํ”„ ํŽ˜์ด์ง€ + ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ํฌ์ธํ„ฐ

5.7 ๋ณต์žกํ•œ ์ˆ ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์„ ํƒ(Selection with Complex Predicates)

์—ฐ์–ธ ์„ ํƒ(Conjunctive selection) (ฯƒ_{ฮธโ‚ โˆง ฮธโ‚‚ โˆง ... โˆง ฮธโ‚™}):

  1. ํ•œ ์กฐ๊ฑด์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์กฐ๊ฑด์„ ํ•„ํ„ฐ๋กœ ์ ์šฉ
  2. ์—ฌ๋Ÿฌ ์กฐ๊ฑด์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, ์ธ๋ฑ์Šค ๊ต์ง‘ํ•ฉ(index intersection) ์‚ฌ์šฉ: ๊ฐ ์ธ๋ฑ์Šค์—์„œ ๋ ˆ์ฝ”๋“œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•œ ๋‹ค์Œ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฒ€์ƒ‰
  3. ์—ฌ๋Ÿฌ ์†์„ฑ์— ๋Œ€ํ•œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค (์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉด ์ด์ƒ์ )

์„ ์–ธ ์„ ํƒ(Disjunctive selection) (ฯƒ_{ฮธโ‚ โˆจ ฮธโ‚‚ โˆจ ... โˆจ ฮธโ‚™}):

  1. ๋ชจ๋“  ์กฐ๊ฑด์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, ์ธ๋ฑ์Šค ํ•ฉ์ง‘ํ•ฉ(index union) ์‚ฌ์šฉ: ๊ฐ ์ธ๋ฑ์Šค์—์„œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌํ•จ
  2. ์–ด๋–ค ์กฐ๊ฑด์— ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด, ์„ ํ˜• ์Šค์บ”์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ (ํ•˜๋‚˜์˜ ๋ˆ„๋ฝ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์ „์ฒด ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ฌดํšจํ™”)

5.8 ๋น„๊ต ์š”์•ฝ(Comparison Summary)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์กฐ๊ฑด ๋น„์šฉ (๋ธ”๋ก)
์„ ํ˜• ์Šค์บ” ํ•ญ์ƒ b_r
์ด์ง„ ๊ฒ€์ƒ‰ ์ •๋ ฌ๋œ ํŒŒ์ผ, ๋™๋“ฑ ์กฐ๊ฑด โŒˆlogโ‚‚(b_r)โŒ‰
๊ธฐ๋ณธ Bโบ-ํŠธ๋ฆฌ, ํ‚ค ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค h_i + 1
๊ธฐ๋ณธ Bโบ-ํŠธ๋ฆฌ, ๋น„ํ‚ค ๋น„ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค h_i + ์ผ์น˜ํ•˜๋Š” ๋ธ”๋ก
๋ณด์กฐ Bโบ-ํŠธ๋ฆฌ, ํ‚ค ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค h_i + 1
๋ณด์กฐ Bโบ-ํŠธ๋ฆฌ, ๋น„ํ‚ค ๋น„ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค h_i + n (๊ฐ ์ผ์น˜ = 1 ํƒ์ƒ‰!)

6. ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Join Algorithms)

์กฐ์ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ ํƒ์ด ์„ฑ๋Šฅ์— ๊ทน์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

6.1 ํ‘œ๊ธฐ๋ฒ•(Notation)

๋ฆด๋ ˆ์ด์…˜ r (์™ธ๋ถ€)๊ณผ s (๋‚ด๋ถ€)๋ฅผ ์กฐ์ธํ•ฉ๋‹ˆ๋‹ค: - b_r, b_s = ๋ธ”๋ก ์ˆ˜ - n_r, n_s = ํŠœํ”Œ ์ˆ˜ - M = ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€

6.2 ์•Œ๊ณ ๋ฆฌ์ฆ˜ J1: ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ(Nested Loop Join, NLJ)

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜. r์˜ ๊ฐ ํŠœํ”Œ์— ๋Œ€ํ•ด s์˜ ๋ชจ๋“  ๊ฒƒ์„ ์Šค์บ”ํ•˜์—ฌ ์ผ์น˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

ALGORITHM: NestedLoopJoin(r, s, ฮธ)
FOR EACH tuple t_r IN r DO
    FOR EACH tuple t_s IN s DO
        IF (t_r, t_s) satisfies ฮธ THEN
            output (t_r โ‹ˆ t_s)
        END IF
    END FOR
END FOR

๋น„์šฉ (์ตœ์•…์˜ ๊ฒฝ์šฐ โ€” ๊ฐ ๋ฆด๋ ˆ์ด์…˜์— ๋‹จ์ผ ๋ฒ„ํผ ํŽ˜์ด์ง€):

๋น„์šฉ = n_r ร— b_s + b_r   ๋ธ”๋ก ์ „์†ก
     = n_r + b_r          ํƒ์ƒ‰

r์˜ n_r ํŠœํ”Œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด s์˜ ๋ชจ๋“  b_s ๋ธ”๋ก์„ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ r ์ž์ฒด์˜ b_r ๋ธ”๋ก ์ฝ๊ธฐ.

์˜ˆ์ œ: employees (์™ธ๋ถ€)๋ฅผ departments (๋‚ด๋ถ€)์™€ ์กฐ์ธ: - n_r = 10,000, b_s = 2, b_r = 500 - ์ „์†ก: 10,000 ร— 2 + 500 = 20,500 - ํƒ์ƒ‰: 10,000 + 500 = 10,500 - ์‹œ๊ฐ„: 20,500 ร— 0.1ms + 10,500 ร— 4ms = 44,050 ms โ‰ˆ 44์ดˆ

์ตœ์ ํ™”: ํ•ญ์ƒ ๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์„ ๋‚ด๋ถ€(s)๋กœ ๋ฐฐ์น˜ํ•˜์„ธ์š”. ๊ตํ™˜ํ•˜๋ฉด: - n_r = 50, b_s = 500, b_r = 2 - ์ „์†ก: 50 ร— 500 + 2 = 25,002 - ์ด๋Š” ์ „์†ก์—์„œ๋Š” ๋” ๋‚˜์˜์ง€๋งŒ ํƒ์ƒ‰์—์„œ๋Š” ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํŠœํ”Œ ์ˆ˜์ค€ ์ค‘์ฒฉ ๋ฃจํ”„๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธ”๋ก ์ˆ˜์ค€์ด ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

6.3 ์•Œ๊ณ ๋ฆฌ์ฆ˜ J2: ๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ(Block Nested Loop Join, BNLJ)

ํŠœํ”Œ๋ณ„ ๋ฐ˜๋ณต ๋Œ€์‹  ๋ธ”๋ก๋ณ„๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

ALGORITHM: BlockNestedLoopJoin(r, s, ฮธ)
FOR EACH block B_r OF r DO
    FOR EACH block B_s OF s DO
        FOR EACH tuple t_r IN B_r DO
            FOR EACH tuple t_s IN B_s DO
                IF (t_r, t_s) satisfies ฮธ THEN
                    output (t_r โ‹ˆ t_s)
                END IF
            END FOR
        END FOR
    END FOR
END FOR

๋น„์šฉ:

๋ธ”๋ก ์ „์†ก = b_r ร— b_s + b_r
ํƒ์ƒ‰     = 2 ร— b_r

r์˜ ๊ฐ ๋ธ”๋ก์€ ํ•œ ๋ฒˆ ์ฝํž™๋‹ˆ๋‹ค. r์˜ ๊ฐ ๋ธ”๋ก์— ๋Œ€ํ•ด s์˜ ์ „๋ถ€๊ฐ€ ์Šค์บ”๋ฉ๋‹ˆ๋‹ค (b_s ๋ธ”๋ก). s๋Š” b_r๋ฒˆ ์ฝํž™๋‹ˆ๋‹ค.

์˜ˆ์ œ: ๋™์ผํ•œ ํ…Œ์ด๋ธ”: - ์ „์†ก: 500 ร— 2 + 500 = 1,500 - ํƒ์ƒ‰: 2 ร— 500 = 1,000 - ์‹œ๊ฐ„: 1,500 ร— 0.1ms + 1,000 ร— 4ms = 4,150 ms โ‰ˆ 4.2์ดˆ

ํŠœํ”Œ ์ˆ˜์ค€ NLJ๋ณด๋‹ค 10๋ฐฐ ๊ฐœ์„ !

M ๋ฒ„ํผ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•œ ์ถ”๊ฐ€ ์ตœ์ ํ™”:

์™ธ๋ถ€ ๋ฆด๋ ˆ์ด์…˜์— (M - 2) ํŽ˜์ด์ง€, ๋‚ด๋ถ€์— 1 ํŽ˜์ด์ง€, ์ถœ๋ ฅ์— 1 ํŽ˜์ด์ง€ ์‚ฌ์šฉ:

๋ธ”๋ก ์ „์†ก = โŒˆb_r / (M-2)โŒ‰ ร— b_s + b_r
ํƒ์ƒ‰     = 2 ร— โŒˆb_r / (M-2)โŒ‰

M = 52์ธ ๊ฒฝ์šฐ (์™ธ๋ถ€์— 50 ํŽ˜์ด์ง€, ๋‚ด๋ถ€์— 1, ์ถœ๋ ฅ์— 1): - ์™ธ๋ถ€ ์ฒญํฌ: โŒˆ500 / 50โŒ‰ = 10 - ์ „์†ก: 10 ร— 2 + 500 = 520 - ํƒ์ƒ‰: 2 ร— 10 = 20 - ์‹œ๊ฐ„: 520 ร— 0.1ms + 20 ร— 4ms = 132 ms

์ „์ฒด ์™ธ๋ถ€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์œผ๋ฉด (b_r โ‰ค M - 2), ๋น„์šฉ์€ b_r + b_s ์ „์†ก๊ณผ 2 ํƒ์ƒ‰๋ฟ์ž…๋‹ˆ๋‹ค โ€” ๋‹จ์ผ ํŒจ์Šค!

6.4 ์•Œ๊ณ ๋ฆฌ์ฆ˜ J3: ์ธ๋ฑ์Šค ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ(Indexed Nested Loop Join)

๋‚ด๋ถ€ ๋ฆด๋ ˆ์ด์…˜์˜ ์กฐ์ธ ์†์„ฑ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, ์Šค์บ” ๋Œ€์‹  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ALGORITHM: IndexedNestedLoopJoin(r, s, ฮธ)
FOR EACH tuple t_r IN r DO
    s์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ t_r๊ณผ ์ผ์น˜ํ•˜๋Š” ํŠœํ”Œ ์ฐพ๊ธฐ
    FOR EACH matching t_s DO
        output (t_r โ‹ˆ t_s)
    END FOR
END FOR

๋น„์šฉ:

๋น„์šฉ = b_r + n_r ร— c

์—ฌ๊ธฐ์„œ c๋Š” s์— ๋Œ€ํ•œ ๋‹จ์ผ ์ธ๋ฑ์Šค ์กฐํšŒ ๋น„์šฉ์ž…๋‹ˆ๋‹ค (์ผ๋ฐ˜์ ์œผ๋กœ Bโบ-ํŠธ๋ฆฌ์˜ ํ‚ค์— ๋Œ€ํ•œ ๋™๋“ฑ ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ h_i + 1).

์˜ˆ์ œ: departments.dept_id์— ์ธ๋ฑ์Šค (h_i = 2): - c = 2 + 1 = 3 (์ธ๋ฑ์Šค ์ˆœํšŒ + 1 ๋ฐ์ดํ„ฐ ๋ธ”๋ก) - ๋น„์šฉ: 500 + 10,000 ร— 3 = 30,500 ๋ธ”๋ก ์•ก์„ธ์Šค - ํ•˜์ง€๋งŒ ํƒ์ƒ‰์„ ๊ณ ๋ คํ•˜๋ฉด: ์ธ๋ฑ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋ฉด BNLJ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ข‹์Œ

์ธ๋ฑ์Šค๊ฐ€ ๋ฒ„ํผ ์บ์‹œ์— ์žˆ์œผ๋ฉด (์ž‘์€ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ): - c โ‰ˆ 1 (๋ฐ์ดํ„ฐ ๋ธ”๋ก๋งŒ) - ๋น„์šฉ: 500 + 10,000 ร— 1 = 10,500 ์ „์†ก

6.5 ์•Œ๊ณ ๋ฆฌ์ฆ˜ J4: ์ •๋ ฌ-๋ณ‘ํ•ฉ ์กฐ์ธ(Sort-Merge Join)

์กฐ์ธ ์†์„ฑ์œผ๋กœ ๋‘ ๋ฆด๋ ˆ์ด์…˜์„ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

ALGORITHM: SortMergeJoin(r, s, join_attr)
Phase 1: r์„ join_attr๋กœ ์ •๋ ฌ (์™ธ๋ถ€ ๋ณ‘ํ•ฉ ์ •๋ ฌ)
Phase 2: s๋ฅผ join_attr๋กœ ์ •๋ ฌ (์™ธ๋ถ€ ๋ณ‘ํ•ฉ ์ •๋ ฌ)
Phase 3: ๋ณ‘ํ•ฉ
    p_r โ† ์ •๋ ฌ๋œ r์˜ ์ฒซ ๋ฒˆ์งธ ํŠœํ”Œ
    p_s โ† ์ •๋ ฌ๋œ s์˜ ์ฒซ ๋ฒˆ์งธ ํŠœํ”Œ
    WHILE ๋ฆด๋ ˆ์ด์…˜์ด ์†Œ์ง„๋˜์ง€ ์•Š์Œ DO
        IF p_r[join_attr] = p_s[join_attr] THEN
            ๋ชจ๋“  ์ผ์น˜ํ•˜๋Š” ์กฐํ•ฉ ์ถœ๋ ฅ
            ๋™๋“ฑ ๊ทธ๋ฃน์„ ์ง€๋‚˜ ๋‘ ํฌ์ธํ„ฐ ๋ชจ๋‘ ์ „์ง„
        ELSE IF p_r[join_attr] < p_s[join_attr] THEN
            p_r ์ „์ง„
        ELSE
            p_s ์ „์ง„
        END IF
    END WHILE

๋น„์šฉ:

์ •๋ ฌ ๋น„์šฉ = O(b ร— log_M(b)) ๊ฐ ๋ฆด๋ ˆ์ด์…˜์— ๋Œ€ํ•ด (์™ธ๋ถ€ ๋ณ‘ํ•ฉ ์ •๋ ฌ)
๋ณ‘ํ•ฉ ๋น„์šฉ = b_r + b_s (์ •๋ ฌ๋œ ๋‘ ๋ฆด๋ ˆ์ด์…˜์„ ํ†ตํ•œ ๋‹จ์ผ ํŒจ์Šค)

์ด = sort(r) + sort(s) + b_r + b_s

b ๋ธ”๋ก๊ณผ M ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ง„ ๋ฆด๋ ˆ์ด์…˜์˜ ์™ธ๋ถ€ ๋ณ‘ํ•ฉ ์ •๋ ฌ ๋น„์šฉ: - ์ดˆ๊ธฐ ์ •๋ ฌ ํ›„ ๋Ÿฐ ์ˆ˜: โŒˆb / MโŒ‰ - ๋ณ‘ํ•ฉ ํŒจ์Šค ์ˆ˜: โŒˆlog_{M-1}(โŒˆb/MโŒ‰)โŒ‰ - ๊ฐ ํŒจ์Šค๋Š” ๋ชจ๋“  ๋ธ”๋ก์„ ์ฝ๊ณ  ์”๋‹ˆ๋‹ค: ํŒจ์Šค๋‹น 2 ร— b - ์ด ์ •๋ ฌ ๋น„์šฉ: 2 ร— b ร— (1 + โŒˆlog_{M-1}(โŒˆb/MโŒ‰)โŒ‰) ๋ธ”๋ก ์ „์†ก

์˜ˆ์ œ (M = 52): - employees ์ •๋ ฌ: โŒˆ500/52โŒ‰ = 10 ๋Ÿฐ, โŒˆlogโ‚…โ‚(10)โŒ‰ = 1 ๋ณ‘ํ•ฉ ํŒจ์Šค - ๋น„์šฉ: 2 ร— 500 ร— (1 + 1) = 2,000 ์ „์†ก - departments ์ •๋ ฌ: ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์Œ (2 ๋ธ”๋ก < 52) - ๋น„์šฉ: 2 ร— 2 = 4 ์ „์†ก - ๋ณ‘ํ•ฉ: 500 + 2 = 502 ์ „์†ก - ์ด: 2,506 ์ „์†ก

์ •๋ ฌ-๋ณ‘ํ•ฉ์ด ๋›ฐ์–ด๋‚œ ๊ฒฝ์šฐ: - ๋‘ ๋ฆด๋ ˆ์ด์…˜์ด ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์Œ (์ •๋ ฌ ๋‹จ๊ณ„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ!) - ํ•ด์‹œ ์กฐ์ธ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค ์“ฐ๋Š” ํฐ ๋ฆด๋ ˆ์ด์…˜ - ๋น„๋™๋“ฑ ์กฐ์ธ (์ •๋ ฌ-๋ณ‘ํ•ฉ์€ ฮธ-์กฐ์ธ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์‹œ ์กฐ์ธ์€ ๋ถˆ๊ฐ€๋Šฅ)

6.6 ์•Œ๊ณ ๋ฆฌ์ฆ˜ J5: ํ•ด์‹œ ์กฐ์ธ(Hash Join)

๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์— ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋นŒ๋“œํ•œ ๋‹ค์Œ ๋” ํฐ ๊ฒƒ์œผ๋กœ ํ”„๋กœ๋ธŒํ•ฉ๋‹ˆ๋‹ค.

ALGORITHM: HashJoin(r, s, join_attr)
Phase 1 (๋นŒ๋“œ): ๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜(s๋ผ๊ณ  ํ•˜์ž)์„ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ด์‹œ
    hash_table โ† {}
    FOR EACH tuple t_s IN s DO
        bucket โ† hash(t_s[join_attr])
        t_s๋ฅผ hash_table[bucket]์— ์‚ฝ์ž…
    END FOR

Phase 2 (ํ”„๋กœ๋ธŒ): ๋” ํฐ ๋ฆด๋ ˆ์ด์…˜ ์Šค์บ”, ํ•ด์‹œ ํ…Œ์ด๋ธ” ํ”„๋กœ๋ธŒ
    FOR EACH tuple t_r IN r DO
        bucket โ† hash(t_r[join_attr])
        FOR EACH t_s IN hash_table[bucket] DO
            IF t_r[join_attr] = t_s[join_attr] THEN
                output (t_r โ‹ˆ t_s)
            END IF
        END FOR
    END FOR

๋น„์šฉ (๋นŒ๋“œ ๋ฆด๋ ˆ์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž๋Š” ๊ฒฝ์šฐ):

๋น„์šฉ = b_s + b_r  ๋ธ”๋ก ์ „์†ก (๋‘ ๋ฆด๋ ˆ์ด์…˜์„ ํ•œ ๋ฒˆ์”ฉ ์ฝ๊ธฐ)
     = 2          ํƒ์ƒ‰

์ด๊ฒƒ์€ ์ตœ์ ์ž…๋‹ˆ๋‹ค! ๊ฐ ๋ฆด๋ ˆ์ด์…˜์„ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ ์ฝ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ: departments (2 ๋ธ”๋ก)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์Œ: - ๋น„์šฉ: 2 + 500 = 502 ์ „์†ก, 2 ํƒ์ƒ‰ - ์‹œ๊ฐ„: 502 ร— 0.1ms + 2 ร— 4ms = 58.2 ms

Grace ํ•ด์‹œ ์กฐ์ธ (๋นŒ๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š์„ ๋•Œ):

๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š์œผ๋ฉด, ํŒŒํ‹ฐ์…”๋‹ ์‚ฌ์šฉ:

Phase 1 (ํŒŒํ‹ฐ์…˜): r๊ณผ s๋ฅผ ๋ชจ๋‘ M-1 ํŒŒํ‹ฐ์…˜์œผ๋กœ ํ•ด์‹œ
    ๊ฐ ํŒŒํ‹ฐ์…˜์€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋จ

Phase 2 (๋นŒ๋“œ & ํ”„๋กœ๋ธŒ): ๊ฐ ํŒŒํ‹ฐ์…˜ i์— ๋Œ€ํ•ด:
    s์˜ ํŒŒํ‹ฐ์…˜ i๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๋กœ๋“œ
    r์˜ ํŒŒํ‹ฐ์…˜ i๋ฅผ ์Šค์บ”, ํ•ด์‹œ ํ…Œ์ด๋ธ” ํ”„๋กœ๋ธŒ

๋น„์šฉ:

ํŒŒํ‹ฐ์…”๋‹: 2 ร— (b_r + b_s)    ์ „์†ก (์ฝ๊ธฐ + ์“ฐ๊ธฐ ๋ชจ๋‘)
๋นŒ๋“œ & ํ”„๋กœ๋ธŒ: b_r + b_s     ์ „์†ก (๋‘ ํŒŒํ‹ฐ์…˜ ์ฝ๊ธฐ)
์ด: 3 ร— (b_r + b_s)          ์ „์†ก

์š”๊ตฌ์‚ฌํ•ญ: ๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์˜ ๊ฐ ํŒŒํ‹ฐ์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์•„์•ผ ํ•จ:

b_s / (M - 1) โ‰ค M - 2
โŸน b_s โ‰ค (M - 1)(M - 2) โ‰ˆ Mยฒ

๋”ฐ๋ผ์„œ ํ•ด์‹œ ์กฐ์ธ์€ ๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์ด ์ตœ๋Œ€ ์•ฝ Mยฒ ๋ธ”๋ก์„ ๊ฐ€์ง€๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

6.7 ๋น„์šฉ ๋น„๊ต(Cost Comparison)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ธ”๋ก ์ „์†ก ํƒ์ƒ‰ ์ตœ์„ ์˜ ๊ฒฝ์šฐ
์ค‘์ฒฉ ๋ฃจํ”„ n_r ร— b_s + b_r n_r + b_r ์ ˆ๋Œ€ (์ตœ์•…์˜ ๊ฒฝ์šฐ)
๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ โŒˆb_r/(M-2)โŒ‰ ร— b_s + b_r 2โŒˆb_r/(M-2)โŒ‰ ์ธ๋ฑ์Šค ์—†์Œ, ์ž‘์€ M
์ธ๋ฑ์Šค NL b_r + n_r ร— c b_r + n_r ๋‚ด๋ถ€ ์กฐ์ธ ์†์„ฑ์— ์ธ๋ฑ์Šค
์ •๋ ฌ-๋ณ‘ํ•ฉ ์ •๋ ฌ ๋น„์šฉ + b_r + b_s ๋งŽ์€ ํƒ์ƒ‰ ์ด๋ฏธ ์ •๋ ฌ๋จ, ๋˜๋Š” ฮธ-์กฐ์ธ
ํ•ด์‹œ ์กฐ์ธ (์ธ๋ฉ”๋ชจ๋ฆฌ) b_r + b_s 2 ๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์Œ
Grace ํ•ด์‹œ ์กฐ์ธ 3(b_r + b_s) ์ค‘๊ฐ„ ํฐ ๋ฆด๋ ˆ์ด์…˜, Mยฒ ์ถฉ๋ถ„

์šฐ๋ฆฌ ์˜ˆ์ œ์— ๋Œ€ํ•œ ์‹ค์ œ ๋น„๊ต (employees โ‹ˆ departments, M = 52):

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „์†ก ์‹œ๊ฐ„ (๋Œ€๋žต)
ํŠœํ”Œ NLJ 20,500 44์ดˆ
๋ธ”๋ก NLJ (M=52) 520 132 ms
์ •๋ ฌ-๋ณ‘ํ•ฉ 2,506 ~260 ms
ํ•ด์‹œ ์กฐ์ธ (์ธ๋ฉ”๋ชจ๋ฆฌ) 502 58 ms

๋” ์ž‘์€ ๋ฆด๋ ˆ์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์„ ๋•Œ ํ•ด์‹œ ์กฐ์ธ์ด ๊ฒฐ์ •์ ์œผ๋กœ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


7. ์ฟผ๋ฆฌ ์ตœ์ ํ™”(Query Optimization)

7.1 ๊ฐœ์š”(Overview)

์ตœ์ ํ™”๊ธฐ๋Š” ์ดˆ๊ธฐ ์ฟผ๋ฆฌ ๊ณ„ํš์„ ๋™๋“ฑํ•˜์ง€๋งŒ ๋” ํšจ์œจ์ ์ธ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ ‘๊ทผ ๋ฐฉ์‹:

  1. ํœด๋ฆฌ์Šคํ‹ฑ(๊ทœ์น™ ๊ธฐ๋ฐ˜) ์ตœ์ ํ™”(Heuristic (rule-based) optimization): "๊ฑฐ์˜ ํ•ญ์ƒ" ์œ ์ตํ•œ ๋ณ€ํ™˜ ๊ทœ์น™ ์ ์šฉ
  2. ๋น„์šฉ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”(Cost-based optimization): ๋Œ€์•ˆ ๊ณ„ํš ๋‚˜์—ด, ๊ฐ ๋น„์šฉ ์ถ”์ •, ๊ฐ€์žฅ ์ €๋ ดํ•œ ๊ฒƒ ์„ ํƒ

๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ œ ์‹œ์Šคํ…œ์€ ๋‘ ๊ฐ€์ง€์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

7.2 ๊ด€๊ณ„ ๋Œ€์ˆ˜์˜ ๋™๋“ฑ ๊ทœ์น™(Equivalence Rules for Relational Algebra)

์ด๋Ÿฌํ•œ ๊ทœ์น™์€ ์ตœ์ ํ™”๊ธฐ๊ฐ€ ํ•œ ํ‘œํ˜„์‹์„ ๋™๋“ฑํ•œ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

๊ทœ์น™ 1: ์„ ํƒ์˜ ์—ฐ์‡„(Cascade of Selections)

ฯƒ_{ฮธโ‚ โˆง ฮธโ‚‚}(r) = ฯƒ_{ฮธโ‚}(ฯƒ_{ฮธโ‚‚}(r))

์—ฐ์–ธ์€ ์ˆœ์ฐจ์  ์„ ํƒ์œผ๋กœ ๋ถ„ํ• ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทœ์น™ 2: ์„ ํƒ์˜ ๊ตํ™˜์„ฑ(Commutativity of Selection)

ฯƒ_{ฮธโ‚}(ฯƒ_{ฮธโ‚‚}(r)) = ฯƒ_{ฮธโ‚‚}(ฯƒ_{ฮธโ‚}(r))

์„ ํƒ์˜ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทœ์น™ 3: ํˆฌ์˜์˜ ์—ฐ์‡„(Cascade of Projections)

ฯ€_{Lโ‚}(ฯ€_{Lโ‚‚}(...(ฯ€_{Lโ‚™}(r)))) = ฯ€_{Lโ‚}(r)

๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ํˆฌ์˜๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค (Lโ‚ โІ Lโ‚‚ โІ ... โІ Lโ‚™์ธ ํ•œ).

๊ทœ์น™ 4: ์กฐ์ธ์˜ ๊ตํ™˜์„ฑ(Commutativity of Join)

r โ‹ˆ s = s โ‹ˆ r

๊ทœ์น™ 5: ์กฐ์ธ์˜ ๊ฒฐํ•ฉ์„ฑ(Associativity of Join)

(r โ‹ˆ s) โ‹ˆ t = r โ‹ˆ (s โ‹ˆ t)

์ด๋Š” ๋‹ค๋ฐฉํ–ฅ ์กฐ์ธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. n๊ฐœ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ, (2(n-1))! / (n-1)! ๋‹ค๋ฅธ ์กฐ์ธ ์ˆœ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์นดํƒˆ๋ž€ ์ˆ˜). 5๊ฐœ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ, 14๊ฐœ ์ˆœ์„œ. 10๊ฐœ ํ…Œ์ด๋ธ”: 4,862๊ฐœ.

๊ทœ์น™ 6: ์กฐ์ธ์„ ํ†ตํ•œ ์„ ํƒ ํ‘ธ์‹œ(Push Selection Through Join)

ฯƒ_{ฮธ}(r โ‹ˆ s) = ฯƒ_{ฮธ}(r) โ‹ˆ s     (ฮธ๊ฐ€ r์˜ ์†์„ฑ๋งŒ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ)

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

๊ทœ์น™ 7: ์ง‘ํ•ฉ ์—ฐ์‚ฐ์„ ํ†ตํ•œ ์„ ํƒ ํ‘ธ์‹œ(Push Selection Through Set Operations)

ฯƒ_{ฮธ}(r โˆช s) = ฯƒ_{ฮธ}(r) โˆช ฯƒ_{ฮธ}(s)
ฯƒ_{ฮธ}(r โˆฉ s) = ฯƒ_{ฮธ}(r) โˆฉ s     (๋˜๋Š” r โˆฉ ฯƒ_{ฮธ}(s))
ฯƒ_{ฮธ}(r - s) = ฯƒ_{ฮธ}(r) - s

๊ทœ์น™ 8: ์กฐ์ธ์„ ํ†ตํ•œ ํˆฌ์˜ ํ‘ธ์‹œ(Push Projection Through Join)

ฯ€_{L}(r โ‹ˆ_{ฮธ} s) = ฯ€_{L}(ฯ€_{Lโ‚}(r) โ‹ˆ_{ฮธ} ฯ€_{Lโ‚‚}(s))

์—ฌ๊ธฐ์„œ Lโ‚ = L ๋˜๋Š” ฮธ์— ํ•„์š”ํ•œ r์˜ ์†์„ฑ, Lโ‚‚ = L ๋˜๋Š” ฮธ์— ํ•„์š”ํ•œ s์˜ ์†์„ฑ.

7.3 ํœด๋ฆฌ์Šคํ‹ฑ ์ตœ์ ํ™”(Heuristic Optimization)

์ผ๋ฐ˜ ์ „๋žต:

  1. ์—ฐ์–ธ ์„ ํƒ ๋ถ„ํ•ด (๊ทœ์น™ 1)
  2. ์„ ํƒ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์•„๋ž˜๋กœ ํ‘ธ์‹œ (๊ทœ์น™ 6, 7)
  3. ํˆฌ์˜์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์•„๋ž˜๋กœ ํ‘ธ์‹œ (๊ทœ์น™ 8)
  4. ์กฐ์ธ ์ˆœ์„œ ์„ ํƒ: ๊ฐ€์žฅ ์„ ํƒ์ ์ธ ์กฐ์ธ์„ ๋จผ์ € ๋ฐฐ์น˜
  5. ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ ์‹๋ณ„

์˜ˆ์ œ: ํœด๋ฆฌ์Šคํ‹ฑ ์ตœ์ ํ™”

์›๋ณธ:

ฯ€_{e.name, d.dept_name}(ฯƒ_{e.salary > 80000 โˆง d.building = 'Watson'}(employees โ‹ˆ departments))

1๋‹จ๊ณ„: ์„ ํƒ ๋ถ„ํ•ด

ฯ€_{e.name, d.dept_name}(ฯƒ_{e.salary > 80000}(ฯƒ_{d.building = 'Watson'}(employees โ‹ˆ departments)))

2๋‹จ๊ณ„: ์„ ํƒ ํ‘ธ์‹œ ๋‹ค์šด

ฯ€_{e.name, d.dept_name}(ฯƒ_{e.salary > 80000}(employees) โ‹ˆ ฯƒ_{d.building = 'Watson'}(departments))

3๋‹จ๊ณ„: ํˆฌ์˜ ํ‘ธ์‹œ ๋‹ค์šด

ฯ€_{e.name, d.dept_name}(
    ฯ€_{e.name, e.dept_id}(ฯƒ_{e.salary > 80000}(employees))
    โ‹ˆ
    ฯ€_{d.dept_id, d.dept_name}(ฯƒ_{d.building = 'Watson'}(departments))
)

์ „ํ›„ ๋น„๊ต:

์ „: ๋ชจ๋“  ์ง์›์„ ๋ชจ๋“  ๋ถ€์„œ์™€ ์กฐ์ธ, ๊ทธ ๋‹ค์Œ ํ•„ํ„ฐ๋ง.
  ๋น„์šฉ: 10,000 ร— 50 = 500,000 ์ค‘๊ฐ„ ํŠœํ”Œ

ํ›„: ์ง์› ํ•„ํ„ฐ๋ง (1,000๊ฐœ ๋‚จ์Œ) ๋ฐ ๋ถ€์„œ (5๊ฐœ ๋‚จ์Œ), ๊ทธ ๋‹ค์Œ ์กฐ์ธ.
  ๋น„์šฉ: 1,000 ร— 5 = 5,000 ์ค‘๊ฐ„ ํŠœํ”Œ โ€” 100๋ฐฐ ๊ฐ์†Œ!

7.4 ๋น„์šฉ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”(Cost-Based Optimization)

ํœด๋ฆฌ์Šคํ‹ฑ ์ตœ์ ํ™”๋Š” ์ข‹์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๊ธฐ๋Š” ๊ฐ ๊ณ„ํš์˜ ์‹ค์ œ ๋น„์šฉ์„ ์ถ”์ •ํ•˜์—ฌ ์ตœ์„ ์˜ ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ๋„ ์ถ”์ •(Selectivity Estimation)

์ˆ ์–ด์˜ ์„ ํƒ๋„(selectivity)๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ์กฑํ•˜๋Š” ํŠœํ”Œ์˜ ๋ถ„์œจ์„ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:

์ˆ ์–ด ์ถ”์ • ์„ ํƒ๋„
A = v (๋™๋“ฑ ์กฐ๊ฑด) 1 / V(A, r)
A > v (๋ฒ”์œ„, ๊ท ๋“ฑ ๋ถ„ํฌ) (max(A) - v) / (max(A) - min(A))
A โ‰ฅ vโ‚ AND A โ‰ค vโ‚‚ (vโ‚‚ - vโ‚) / (max(A) - min(A))
ฮธโ‚ โˆง ฮธโ‚‚ (์—ฐ์–ธ, ๋…๋ฆฝ) sel(ฮธโ‚) ร— sel(ฮธโ‚‚)
ฮธโ‚ โˆจ ฮธโ‚‚ (์„ ์–ธ, ๋…๋ฆฝ) sel(ฮธโ‚) + sel(ฮธโ‚‚) - sel(ฮธโ‚) ร— sel(ฮธโ‚‚)
NOT ฮธ 1 - sel(ฮธ)

์˜ˆ์ œ: ฯƒ_{salary > 80000}(employees)์˜ ํฌ๊ธฐ ์ถ”์ •

๊ธ‰์—ฌ๊ฐ€ 30,000๋ถ€ํ„ฐ 150,000๊นŒ์ง€์˜ ๋ฒ”์œ„ (๊ท ๋“ฑ ๋ถ„ํฌ):

sel = (150,000 - 80,000) / (150,000 - 30,000) = 70,000 / 120,000 โ‰ˆ 0.583
์ถ”์ • ํŠœํ”Œ = 10,000 ร— 0.583 โ‰ˆ 5,833

์กฐ์ธ ํฌ๊ธฐ ์ถ”์ •(Join Size Estimation)

์†์„ฑ A์— ๋Œ€ํ•œ ์ž์—ฐ ์กฐ์ธ r โ‹ˆ s์˜ ๊ฒฝ์šฐ:

์ถ”์ • ํฌ๊ธฐ = (n_r ร— n_s) / max(V(A, r), V(A, s))

์˜ˆ์ œ: dept_id์— ๋Œ€ํ•œ employees โ‹ˆ departments:

ํฌ๊ธฐ = (10,000 ร— 50) / max(50, 50) = 500,000 / 50 = 10,000

์ด๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ๊ฐ ์ง์›์€ ํ•˜๋‚˜์˜ ๋ถ€์„œ์— ์žˆ์œผ๋ฏ€๋กœ, ์กฐ์ธ์€ ์ง์›๋‹น ํ•˜๋‚˜์˜ ํŠœํ”Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํžˆ์Šคํ† ๊ทธ๋žจ(Histograms)

๊ท ๋“ฑ ๋ถ„ํฌ ๊ฐ€์ •์€ ์ข…์ข… ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํžˆ์Šคํ† ๊ทธ๋žจ โ€” ๊ฐ’์˜ ๋ถ„ํฌ์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค:

๋“ฑํญ ํžˆ์Šคํ† ๊ทธ๋žจ(Equi-width histogram): ๊ฐ’ ๋ฒ”์œ„๋ฅผ ๋™์ผ ํญ ๋ฒ„ํ‚ท์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๋ฒ„ํ‚ท๋‹น ํŠœํ”Œ์„ ์„ธํ—ค์•„๋ฆฝ๋‹ˆ๋‹ค.

๊ธ‰์—ฌ ํžˆ์Šคํ† ๊ทธ๋žจ (5 ๋ฒ„ํ‚ท):
  [30K-54K):  2,500๋ช… ์ง์›
  [54K-78K):  3,000๋ช… ์ง์›
  [78K-102K): 2,500๋ช… ์ง์›
  [102K-126K): 1,500๋ช… ์ง์›
  [126K-150K]: 500๋ช… ์ง์›

์ด ํžˆ์Šคํ† ๊ทธ๋žจ์œผ๋กœ ฯƒ_{salary > 80000}์„ ์ถ”์ •ํ•˜๋ฉด:

(102K-80K)/(102K-78K) ร— 2,500 + 1,500 + 500 = (22/24) ร— 2,500 + 2,000 โ‰ˆ 4,292

๊ท ๋“ฑ ์ถ”์ • 5,833๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค!

๋“ฑ๊นŠ์ด(๋“ฑ๋†’์ด) ํžˆ์Šคํ† ๊ทธ๋žจ(Equi-depth (equi-height) histogram): ๊ฐ ๋ฒ„ํ‚ท์ด ๋Œ€๋žต ๋™์ผํ•œ ์ˆ˜์˜ ํŠœํ”Œ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์น˜์šฐ์นœ ๋ถ„ํฌ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

7.5 ์กฐ์ธ ์ˆœ์„œ ์ตœ์ ํ™”(Join Ordering Optimization)

๋‹ค๋ฐฉํ–ฅ ์กฐ์ธ์˜ ๊ฒฝ์šฐ, ์ˆœ์„œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

SELECT *
FROM r1 JOIN r2 ON ... JOIN r3 ON ... JOIN r4 ON ...

๊ฐ€๋Šฅํ•œ ์ˆœ์„œ (4๊ฐœ ํ…Œ์ด๋ธ”): 1. ((r1 โ‹ˆ r2) โ‹ˆ r3) โ‹ˆ r4 2. (r1 โ‹ˆ (r2 โ‹ˆ r3)) โ‹ˆ r4 3. (r1 โ‹ˆ r2) โ‹ˆ (r3 โ‹ˆ r4) 4. ... (ํ›จ์”ฌ ๋” ๋งŽ์Œ)

์ตœ์ ํ™”๊ธฐ๋Š” ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์„ ์˜ ์ˆœ์„œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค:

ALGORITHM: FindBestJoinOrder({Rโ‚, Rโ‚‚, ..., Rโ‚™})

FOR each single relation Rแตข DO
    bestPlan({Rแตข}) โ† Rแตข์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ฒฝ๋กœ
END FOR

FOR size = 2 TO n DO
    FOR each subset S of size 'size' DO
        bestPlan(S) โ† S๋ฅผ ๋น„์–ด ์žˆ์ง€ ์•Š์€ Sโ‚ โˆช Sโ‚‚๋กœ ๋ถ„ํ• ํ•˜๋Š”
                       ๋ชจ๋“  ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ MIN:
                       cost(bestPlan(Sโ‚) โ‹ˆ bestPlan(Sโ‚‚))
    END FOR
END FOR

RETURN bestPlan({Rโ‚, Rโ‚‚, ..., Rโ‚™})

์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์กฐ์ธ ํŠธ๋ฆฌ(์™ผ์ชฝ-๊นŠ์€ ํŠธ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ค๋ถˆ ํŠธ๋ฆฌ๋„ ํฌํ•จ)๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žก๋„: O(3โฟ) โ€” ์ง€์ˆ˜์ ์ด์ง€๋งŒ ์ตœ๋Œ€ ~15-20๊ฐœ ํ…Œ์ด๋ธ”๊นŒ์ง€์˜ ์ฟผ๋ฆฌ์— ์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค.

๋” ํฐ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ, ํœด๋ฆฌ์Šคํ‹ฑ ๋˜๋Š” ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋Œ€์‹  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

7.6 ์™ผ์ชฝ-๊นŠ์€ vs ๋ค๋ถˆ ์กฐ์ธ ํŠธ๋ฆฌ(Left-Deep vs Bushy Join Trees)

์™ผ์ชฝ-๊นŠ์€ ํŠธ๋ฆฌ:              ๋ค๋ถˆ ํŠธ๋ฆฌ:

        โ‹ˆ                        โ‹ˆ
       / \                      / \
      โ‹ˆ   Rโ‚„                  โ‹ˆ   โ‹ˆ
     / \                      / \ / \
    โ‹ˆ   Rโ‚ƒ                  Rโ‚ Rโ‚‚ Rโ‚ƒ Rโ‚„
   / \
  Rโ‚  Rโ‚‚

์™ผ์ชฝ-๊นŠ์€ ํŠธ๋ฆฌ๋Š” ๋งŽ์€ ์ตœ์ ํ™”๊ธฐ๊ฐ€ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค: 1. ๊ฐ ์กฐ์ธ ๋‹จ๊ณ„์˜ ๋‚ด๋ถ€ ๋ฆด๋ ˆ์ด์…˜์ด ํŒŒ์ดํ”„๋ผ์ด๋‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ตฌ์ฒดํ™” ์—†์Œ) 2. ์ธ๋ฑ์Šค ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (๋‚ด๋ถ€ = ์ธ๋ฑ์Šค๋œ ํ…Œ์ด๋ธ”) 3. ๊ฒ€์ƒ‰ ๊ณต๊ฐ„์ด ๋” ์ž‘์Šต๋‹ˆ๋‹ค: n! ์ˆœ์„œ vs ๋ค๋ถˆ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ง€์ˆ˜์ ์œผ๋กœ ๋” ๋งŽ์Œ


8. ํ†ต๊ณ„ ๋ฐ ์นดํƒˆ๋กœ๊ทธ ์ •๋ณด(Statistics and Catalog Information)

8.1 ์นดํƒˆ๋กœ๊ทธ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ(What the Catalog Stores)

์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)๋Š” ๋น„์šฉ ์ถ”์ •์„ ์œ„ํ•œ ํ†ต๊ณ„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค:

-- PostgreSQL ์นดํƒˆ๋กœ๊ทธ ํ…Œ์ด๋ธ”:
pg_class     -- ํ…Œ์ด๋ธ”/์ธ๋ฑ์Šค ํ†ต๊ณ„ (n_r, b_r ๋“ฑ)
pg_statistic -- ์—ด ์ˆ˜์ค€ ํ†ต๊ณ„ (ํžˆ์Šคํ† ๊ทธ๋žจ, ๊ณ ์œ  ๊ฐ’, ์ƒ๊ด€๊ด€๊ณ„)
pg_stats     -- ํ†ต๊ณ„์˜ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ทฐ

์ฃผ์š” ํ†ต๊ณ„: - n_r (reltuples): ํ…Œ์ด๋ธ”์˜ ํ–‰ ์ˆ˜ - b_r (relpages): ๋””์Šคํฌ ํŽ˜์ด์ง€ ์ˆ˜ - V(A, r) (n_distinct): ์—ด๋‹น ๊ณ ์œ  ๊ฐ’ ์ˆ˜ - ํžˆ์Šคํ† ๊ทธ๋žจ(Histograms): ์—ด๋‹น ๊ฐ’ ๋ถ„ํฌ - ์ƒ๊ด€๊ด€๊ณ„(Correlation): ๋ฌผ๋ฆฌ์  ์ˆœ์„œ๊ฐ€ ๋…ผ๋ฆฌ์  ์ˆœ์„œ์™€ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ผ์น˜ํ•˜๋Š”์ง€ (๋ฒ”์œ„ ์Šค์บ”์— ์ค‘์š”) - ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฐ’(Most common values, MCV): ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ๊ฐ’์˜ ๋ชฉ๋ก๊ณผ ๊ทธ ๋นˆ๋„ - NULL ๋ถ„์œจ(NULL fraction): ์—ด๋‹น NULL ๊ฐ’์˜ ๋ถ„์œจ

8.2 ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ(Updating Statistics)

๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ํ†ต๊ณ„๊ฐ€ ์˜ค๋ž˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ†ต๊ณ„๋ฅผ ์ƒˆ๋กœ ๊ณ ์น  ๋ช…๋ น์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

-- PostgreSQL
ANALYZE employees;              -- ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ
ANALYZE;                         -- ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ
ALTER TABLE employees SET (autovacuum_analyze_threshold = 50);

-- MySQL
ANALYZE TABLE employees;

-- SQL Server
UPDATE STATISTICS employees;

PostgreSQL์˜ autovacuum ํ”„๋กœ์„ธ์Šค๋Š” ์ถฉ๋ถ„ํ•œ ํ–‰์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ†ต๊ณ„๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’: ํ…Œ์ด๋ธ”์˜ 10%).

8.3 ์˜ค๋ž˜๋œ ํ†ต๊ณ„์˜ ์˜ํ–ฅ(Impact of Stale Statistics)

์˜ค๋ž˜๋œ ํ†ต๊ณ„๋Š” ๋‚˜์œ ๊ณ„ํš์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค:

์‹œ๋‚˜๋ฆฌ์˜ค: ํ†ต๊ณ„๊ฐ€ ์ˆ˜์ง‘๋˜์—ˆ์„ ๋•Œ ํ…Œ์ด๋ธ”์ด 1,000๊ฐœ ํ–‰์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค.
          ์ด์ œ 1,000,000๊ฐœ ํ–‰์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์ตœ์ ํ™”๊ธฐ ์ƒ๊ฐ: "์ž‘์€ ํ…Œ์ด๋ธ”, ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ์ด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค."
ํ˜„์‹ค: "๊ฑฐ๋Œ€ํ•œ ํ…Œ์ด๋ธ”, ํ•ด์‹œ ์กฐ์ธ์ด 1000๋ฐฐ ๋” ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค."

์ด๊ฒƒ์€ ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ์—์„œ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์›์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.


9. ์ฟผ๋ฆฌ ์‹คํ–‰ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜(Query Execution Engine Architecture)

9.1 ๊ตฌ์„ฑ ์š”์†Œ(Components)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Query Executor                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ Plan Cache  โ”‚  โ”‚ Iterator   โ”‚  โ”‚ Expression         โ”‚ โ”‚
โ”‚  โ”‚ (prepared   โ”‚  โ”‚ Operators  โ”‚  โ”‚ Evaluator          โ”‚ โ”‚
โ”‚  โ”‚  statements)โ”‚  โ”‚            โ”‚  โ”‚ (predicates,       โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - SeqScan  โ”‚  โ”‚  projections,      โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - IdxScan  โ”‚  โ”‚  aggregations)     โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - NestLoop โ”‚  โ”‚                    โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - HashJoin โ”‚  โ”‚                    โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - SortMrg  โ”‚  โ”‚                    โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - HashAgg  โ”‚  โ”‚                    โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚ - Sort     โ”‚  โ”‚                    โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                         โ”‚                                 โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”‚
โ”‚              โ”‚  Buffer Manager     โ”‚                     โ”‚
โ”‚              โ”‚  (page cache)       โ”‚                     โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ”‚
โ”‚                         โ”‚                                 โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”‚
โ”‚              โ”‚  Storage Engine     โ”‚                     โ”‚
โ”‚              โ”‚  (disk I/O)         โ”‚                     โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

9.2 ๊ณ„ํš ์บ์‹ฑ(Plan Caching)

ํŒŒ์‹ฑ๊ณผ ์ตœ์ ํ™”๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋„๋ก ์‹คํ–‰ ๊ณ„ํš์„ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค:

-- PostgreSQL: ์ค€๋น„๋œ ๋ฌธ์€ ๊ณ„ํš์„ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค
PREPARE find_emp(int) AS
    SELECT * FROM employees WHERE emp_id = $1;

EXECUTE find_emp(42);   -- ์ฒซ ์‹คํ–‰: ํŒŒ์‹ฑ + ์ตœ์ ํ™” + ์‹คํ–‰
EXECUTE find_emp(99);   -- ํ›„์†: ์บ์‹œ๋œ ๊ณ„ํš ์žฌ์‚ฌ์šฉ

๊ณ„ํš ๋ฌดํšจํ™”: ์บ์‹œ๋œ ๊ณ„ํš์€ ๋‹ค์Œ์˜ ๊ฒฝ์šฐ ๋ฌดํšจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค: - ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ (ALTER TABLE) - ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ (ANALYZE) - ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋˜๋Š” ์‚ญ์ œ

9.3 ์‹คํ–‰ ๊ณ„ํš ์ฝ๊ธฐ(Reading Execution Plans)

๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋Š” ๋ช…๋ น์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

-- PostgreSQL
EXPLAIN ANALYZE
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > 80000;

์ถœ๋ ฅ (์˜ˆ):

Hash Join  (cost=1.12..25.47 rows=167 width=64) (actual time=0.05..0.31 rows=150 loops=1)
  Hash Cond: (e.dept_id = d.dept_id)
  ->  Seq Scan on employees e  (cost=0.00..22.50 rows=167 width=40) (actual time=0.01..0.15 rows=150 loops=1)
        Filter: (salary > 80000)
        Rows Removed by Filter: 850
  ->  Hash  (cost=1.05..1.05 rows=50 width=28) (actual time=0.02..0.02 rows=50 loops=1)
        Buckets: 1024  Batches: 1  Memory Usage: 12kB
        ->  Seq Scan on departments d  (cost=0.00..1.05 rows=50 width=28) (actual time=0.00..0.01 rows=50 loops=1)
Planning Time: 0.15 ms
Execution Time: 0.38 ms

์ด ๊ณ„ํš ์ฝ๊ธฐ (์•„๋ž˜์—์„œ ์œ„๋กœ): 1. departments์˜ ์ˆœ์ฐจ ์Šค์บ” (50๊ฐœ ํ–‰) โ†’ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋นŒ๋“œ (12 KB) 2. salary > 80000 ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ employees์˜ ์ˆœ์ฐจ ์Šค์บ” (1000๊ฐœ ์ค‘ 150๊ฐœ ํ–‰ ํ†ต๊ณผ) 3. dept_id๋ฅผ ์‚ฌ์šฉํ•œ ํ•ด์‹œ ์กฐ์ธ 4. ์ด: 0.38 ms ์‹คํ–‰ ์‹œ๊ฐ„

9.4 ์ ์‘ํ˜• ์ฟผ๋ฆฌ ์‹คํ–‰(Adaptive Query Execution)

ํ˜„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘์— ์‹คํ–‰ ๊ณ„ํš์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • PostgreSQL: ์ค€๋น„๋œ ๋ฌธ์— ๋Œ€ํ•ด ์ผ๋ฐ˜ vs ๋งž์ถค ๊ณ„ํš์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 5๋ฒˆ ์‹คํ–‰ ํ›„, ๋น„๊ตํ•˜๊ณ  ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Oracle: ์ ์‘ํ˜• ์ปค์„œ ๊ณต์œ  โ€” ์บ์‹œ๋œ ๊ณ„ํš์ด ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์— ๋Œ€ํ•ด ์„ฑ๋Šฅ์ด ๋‚˜์  ๋•Œ ๊ฐ์ง€
  • Spark SQL: ์ ์‘ํ˜• ์ฟผ๋ฆฌ ์‹คํ–‰(Adaptive Query Execution, AQE) โ€” ์‹ค์ œ ํŒŒํ‹ฐ์…˜ ํฌ๊ธฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ฟผ๋ฆฌ ์ค‘๊ฐ„์— ์žฌ์ตœ์ ํ™”

10. ๊ณ ๊ธ‰ ์ฃผ์ œ(Advanced Topics)

10.1 ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ ์‹คํ–‰(Parallel Query Execution)

ํ˜„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—ฌ๋Ÿฌ CPU ์ฝ”์–ด์— ๊ฑธ์ณ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ๋ณ‘๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค:

              Gather
             /  |  \
     Worker1  Worker2  Worker3
        |        |        |
     Scan(p1) Scan(p2) Scan(p3)  โ† ๋ณ‘๋ ฌ ์ˆœ์ฐจ ์Šค์บ”

๋ณ‘๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ: - ์Šค์บ” (ํ…Œ์ด๋ธ”์„ ๋ฒ”์œ„๋กœ ๋‚˜๋ˆ”) - ํ•„ํ„ฐ (๊ฐ ์›Œ์ปค๊ฐ€ ์ž์‹ ์˜ ํŒŒํ‹ฐ์…˜์„ ํ•„ํ„ฐ๋ง) - ํ•ด์‹œ ์กฐ์ธ (๋ณ‘๋ ฌ ๋นŒ๋“œ + ๋ณ‘๋ ฌ ํ”„๋กœ๋ธŒ) - ์ง‘๊ณ„ (์›Œ์ปค๋‹น ๋ถ€๋ถ„ ์ง‘๊ณ„, ๊ทธ ๋‹ค์Œ ๋ณ‘ํ•ฉ) - ์ •๋ ฌ (๋ณ‘๋ ฌ ์ •๋ ฌ, ๊ทธ ๋‹ค์Œ ๋ณ‘ํ•ฉ)

10.2 ์—ด ๊ธฐ๋ฐ˜ ์‹คํ–‰(Columnar Execution)

์ „ํ†ต์ ์ธ ํ–‰ ์ €์žฅ์†Œ: ์ „์ฒด ํ–‰์„ ์ฝ์œผ๋ฉฐ, ์ผ๋ถ€ ์—ด๋งŒ ํ•„์š”ํ•ด๋„.

์—ด ์ €์žฅ์†Œ: ๊ฐ ์—ด์„ ๋ณ„๋„๋กœ ์ €์žฅ, ํ•„์š”ํ•œ ์—ด๋งŒ ์ฝ์Œ.

ํ–‰ ์ €์žฅ์†Œ:                     ์—ด ์ €์žฅ์†Œ:
[id=1, name=Alice, sal=80K]   id:   [1, 2, 3, ...]
[id=2, name=Bob,   sal=90K]   name: [Alice, Bob, ...]
[id=3, name=Carol, sal=75K]   sal:  [80K, 90K, 75K, ...]

๋ถ„์„์„ ์œ„ํ•œ ์—ด ์ €์žฅ์†Œ์˜ ์žฅ์ : - ํ•„์š”ํ•œ ์—ด๋งŒ ์ฝ๊ธฐ (๋” ์ ์€ I/O) - ๋” ๋‚˜์€ ์••์ถ• (์œ ์‚ฌํ•œ ๊ฐ’์ด ํ•จ๊ป˜) - CPU ์นœํ™”์  (์—ด ๋ฐฐ์—ด์— ๋Œ€ํ•œ SIMD ์—ฐ์‚ฐ) - ์‚ฌ์šฉ์ฒ˜: DuckDB, ClickHouse, Redshift, BigQuery

10.3 Just-In-Time (JIT) ์ปดํŒŒ์ผ(Just-In-Time (JIT) Compilation)

์ฟผ๋ฆฌ ๊ณ„ํš์„ ํ•ด์„ํ•˜๋Š” ๋Œ€์‹  (๊ฐ ํŠœํ”Œ์— ๋Œ€ํ•ด ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ), ๋„ค์ดํ‹ฐ๋ธŒ ๋จธ์‹  ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ:

์ „ํ†ต์  (ํ•ด์„):
  ๊ฐ ํŠœํ”Œ์— ๋Œ€ํ•ด:
    ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ: ์ˆ ์–ด ํ‰๊ฐ€
    ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ: ์—ด ํˆฌ์˜
    ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ: ์กฐ์ธ์„ ์œ„ํ•œ ํ•ด์‹œ

JIT ์ปดํŒŒ์ผ:
  ๊ฐ ํŠœํ”Œ์— ๋Œ€ํ•ด:
    if tuple.salary > 80000:    // ์ธ๋ผ์ธ, ๊ฐ€์ƒ ๋””์ŠคํŒจ์น˜ ์—†์Œ
      hash = tuple.dept_id % N   // ์ธ๋ผ์ธ
      emit(tuple.name, ...)      // ์ธ๋ผ์ธ

JIT ์ปดํŒŒ์ผ์€ ํ•ด์„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ, ๋ณต์žกํ•œ ํ‘œํ˜„์‹๊ณผ ํฐ ๋ฐ์ดํ„ฐ์…‹์— ํŠนํžˆ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL์€ ํ‘œํ˜„์‹ ํ‰๊ฐ€ ๋ฐ ํŠœํ”Œ ๋ณ€ํ˜•์„ ์œ„ํ•œ JIT ์ปดํŒŒ์ผ์„ (LLVM ์‚ฌ์šฉ) ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


11. ์—ฐ์Šต๋ฌธ์ œ(Exercises)

์—ฐ์Šต๋ฌธ์ œ 1: ๋น„์šฉ ๊ณ„์‚ฐ(Cost Calculation)

์ฃผ์–ด์ง„: - employees: n = 10,000, b = 500, emp_id์— ์ธ๋ฑ์Šค (Bโบ-ํŠธ๋ฆฌ, ๋†’์ด 3) - departments: n = 200, b = 10 - ๋ฉ”๋ชจ๋ฆฌ: M = 12 ํŽ˜์ด์ง€

dept_id๋กœ employees์™€ departments๋ฅผ ์กฐ์ธํ•˜๋Š” ๋น„์šฉ (๋ธ”๋ก ์ „์†ก)์„ ๊ณ„์‚ฐํ•˜์„ธ์š”:

  1. ๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ (employees๊ฐ€ ์™ธ๋ถ€)
  2. ๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ (departments๊ฐ€ ์™ธ๋ถ€)
  3. ํ•ด์‹œ ์กฐ์ธ (departments๊ฐ€ ๋นŒ๋“œ)
ํ•ด๋‹ต 1. **BNLJ (employees ์™ธ๋ถ€)**: - ์™ธ๋ถ€ ์ฒญํฌ: โŒˆ500 / (12-2)โŒ‰ = โŒˆ500/10โŒ‰ = 50 - ๋น„์šฉ: 50 ร— 10 + 500 = 1,000 ์ „์†ก 2. **BNLJ (departments ์™ธ๋ถ€)**: - ์™ธ๋ถ€ ์ฒญํฌ: โŒˆ10 / (12-2)โŒ‰ = โŒˆ10/10โŒ‰ = 1 - ๋น„์šฉ: 1 ร— 500 + 10 = 510 ์ „์†ก 3. **ํ•ด์‹œ ์กฐ์ธ (departments๊ฐ€ ๋นŒ๋“œ)**: - departments (10 ๋ธ”๋ก)๊ฐ€ 12 ํŽ˜์ด์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์Œ - ๋น„์šฉ: 10 + 500 = 510 ์ „์†ก ํ•ด์‹œ ์กฐ์ธ๊ณผ departments-์™ธ๋ถ€ BNLJ๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹œ ์กฐ์ธ์€ ๋” ์ ์€ ํƒ์ƒ‰ (2 vs. 2)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•ด์‹œ ์กฐ์ธ์€ ๋” ๋‚˜์€ ์บ์‹œ ๋™์ž‘์œผ๋กœ ์ธํ•ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

์—ฐ์Šต๋ฌธ์ œ 2: ์„ ํƒ๋„ ์ถ”์ •(Selectivity Estimation)

์ฃผ์–ด์ง„: 10,000๊ฐœ ํ–‰์˜ employees ํ…Œ์ด๋ธ”. - salary: min=30,000, max=150,000, V(salary) = 2,000 - dept_id: V(dept_id) = 50 - city: V(city) = 100

๋‹ค์Œ์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํŠœํ”Œ ์ˆ˜๋ฅผ ์ถ”์ •ํ•˜์„ธ์š”:

  1. ฯƒ_{salary = 75000}(employees)
  2. ฯƒ_{salary > 100000}(employees)
  3. ฯƒ_{dept_id = 5 โˆง city = 'Boston'}(employees)
ํ•ด๋‹ต 1. **salary = 75000**: sel = 1/V(salary) = 1/2000. ๊ฒฐ๊ณผ: 10,000/2,000 = **5 ํŠœํ”Œ** 2. **salary > 100000**: sel = (150,000 - 100,000)/(150,000 - 30,000) = 50,000/120,000 โ‰ˆ 0.417. ๊ฒฐ๊ณผ: 10,000 ร— 0.417 โ‰ˆ **4,167 ํŠœํ”Œ** 3. **dept_id = 5 AND city = 'Boston'** (๋…๋ฆฝ์„ฑ ๊ฐ€์ •): - sel(dept_id = 5) = 1/50 - sel(city = 'Boston') = 1/100 - ๊ฒฐํ•ฉ: (1/50) ร— (1/100) = 1/5,000 - ๊ฒฐ๊ณผ: 10,000 / 5,000 = **2 ํŠœํ”Œ**

์—ฐ์Šต๋ฌธ์ œ 3: ํœด๋ฆฌ์Šคํ‹ฑ ์ตœ์ ํ™”(Heuristic Optimization)

๋‹ค์Œ ์ฟผ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ํœด๋ฆฌ์Šคํ‹ฑ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜์„ธ์š”:

SELECT p.product_name, c.category_name
FROM products p, categories c, order_items oi
WHERE p.category_id = c.category_id
  AND p.product_id = oi.product_id
  AND oi.quantity > 10
  AND c.category_name = 'Electronics';

์ดˆ๊ธฐ ๋ฐ ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ฆฌ์„ธ์š”.

ํ•ด๋‹ต **์ดˆ๊ธฐ (์ตœ์ ํ™”๋˜์ง€ ์•Š์€) ํŠธ๋ฆฌ:**
ฯ€_{product_name, category_name}
    โ”‚
ฯƒ_{p.cat_id=c.cat_id โˆง p.prod_id=oi.prod_id โˆง oi.qty>10 โˆง c.cat_name='Electronics'}
    โ”‚
    ร—  (์นดํ‹ฐ์ „ ๊ณฑ)
   / \
  ร—   oi
 / \
p   c
**์ตœ์ ํ™”๋œ ํŠธ๋ฆฌ (์„ ํƒ ํ‘ธ์‹œ ๋‹ค์šด, ์นดํ‹ฐ์ „ ๊ณฑ ๋Œ€์‹  ์กฐ์ธ ์‚ฌ์šฉ):**
ฯ€_{product_name, category_name}
    โ”‚
    โ‹ˆ_{p.cat_id = c.cat_id}
   / \
  โ‹ˆ_{p.prod_id = oi.prod_id}    ฯƒ_{cat_name='Electronics'}(c)
 / \
p   ฯƒ_{qty > 10}(oi)
**์ ์šฉ๋œ ์ตœ์ ํ™”:** 1. ์—ฐ์–ธ ์„ ํƒ ๋ถ„ํ•ด 2. ฯƒ_{qty > 10}์„ order_items๋กœ ํ‘ธ์‹œ (์กฐ์ธ ์ „) 3. ฯƒ_{cat_name = 'Electronics'}์„ categories๋กœ ํ‘ธ์‹œ (์กฐ์ธ ์ „) 4. ์นดํ‹ฐ์ „ ๊ณฑ์„ ๋ชฉํ‘œ ์กฐ์ธ์œผ๋กœ ๊ต์ฒด 5. ์ผ์ฐ ํˆฌ์˜ (๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ํ‘œ์‹œํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ํ•„์š”ํ•œ ์—ด๋งŒ ํ†ต๊ณผ) ํ•ต์‹ฌ ์ด๋“: categories๊ฐ€ ~1๊ฐœ ํ–‰ ('Electronics')์œผ๋กœ ํ•„ํ„ฐ๋ง๋˜๊ณ , order_items๊ฐ€ ํ•˜์œ„ ์ง‘ํ•ฉ (qty > 10)์œผ๋กœ ํ•„ํ„ฐ๋ง๋œ ํ›„, ์กฐ์ธ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์Šต๋ฌธ์ œ 4: ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ(Join Algorithm Selection)

๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์ตœ์ ํ™”๊ธฐ๊ฐ€ ์–ด๋–ค ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•  ๊ฒƒ ๊ฐ™์€์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”.

  1. 100๊ฐœ ํ–‰ ๋ฃฉ์—… ํ…Œ์ด๋ธ”์„ 1000๋งŒ ๊ฐœ ํ–‰ ํŒฉํŠธ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธ. ํŒฉํŠธ ํ…Œ์ด๋ธ”์˜ ์กฐ์ธ ์—ด์— ์ธ๋ฑ์Šค ์กด์žฌ.
  2. ๋‘ 100๋งŒ ๊ฐœ ํ–‰ ํ…Œ์ด๋ธ”์„ ์กฐ์ธ, ๋‘˜ ๋‹ค ์ •๋ ฌ๋˜์ง€ ์•Š์Œ, ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ (1GB ๋ฒ„ํผ ํ’€).
  3. ๋‘ 100๋งŒ ๊ฐœ ํ–‰ ํ…Œ์ด๋ธ”์„ ๋ฒ”์œ„ ์กฐ๊ฑด์œผ๋กœ ์กฐ์ธ (r.date BETWEEN s.start_date AND s.end_date).
  4. ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š”๋ฐ ๋‘˜ ๋‹ค ์ด๋ฏธ ์กฐ์ธ ์—ด๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์Œ.
ํ•ด๋‹ต 1. **์ธ๋ฑ์Šค ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ.** ๋ฃฉ์—… ํ…Œ์ด๋ธ” (100๊ฐœ ํ–‰)์ด ์™ธ๋ถ€; ๊ฐ ํ–‰์— ๋Œ€ํ•ด ํŒฉํŠธ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์น˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋น„์šฉ: 100๊ฐœ ์ธ๋ฑ์Šค ์กฐํšŒ, ๊ฐ O(log n). 1000๋งŒ ๊ฐœ ํ–‰์„ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. 2. **ํ•ด์‹œ ์กฐ์ธ.** ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋กœ, ํ•œ ํ…Œ์ด๋ธ”์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ๋ฉ”๋ชจ๋ฆฌ์— ์™„์ „ํžˆ ๋งž์Šต๋‹ˆ๋‹ค. ๋น„์šฉ: ๋‘ ํ…Œ์ด๋ธ”์„ ํ•œ ๋ฒˆ์”ฉ ์ฝ๊ธฐ (์ตœ์ ). ์ธ๋ฑ์Šค ๋ถˆํ•„์š”, ์ •๋ ฌ ๋ถˆํ•„์š”. 3. **์ •๋ ฌ-๋ณ‘ํ•ฉ ์กฐ์ธ** ๋˜๋Š” **๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ.** ํ•ด์‹œ ์กฐ์ธ์€ ๋ฒ”์œ„ ์กฐ๊ฑด์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ฒ”์œ„๋ฅผ ํ•ด์‹œํ•  ์ˆ˜ ์—†์Œ). ๋‚ ์งœ ์—ด์— ๋Œ€ํ•œ ์ •๋ ฌ-๋ณ‘ํ•ฉ์€ ํšจ์œจ์ ์ธ ๋ฒ”์œ„ ๋งค์นญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก NLJ๋Š” ์ •๋ ฌ์ด ๋„ˆ๋ฌด ๋น„์‹ธ๋ฉด ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. 4. **์ •๋ ฌ-๋ณ‘ํ•ฉ ์กฐ์ธ (์ •๋ ฌ ๋‹จ๊ณ„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ).** ๋‘ ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋ณ‘ํ•ฉ ๋‹จ๊ณ„ ๋น„์šฉ์€ b_r + b_s์ž…๋‹ˆ๋‹ค โ€” ๊ฐ ํ…Œ์ด๋ธ”์„ ํ†ตํ•œ ๋‹จ์ผ ํŒจ์Šค. ์ด๊ฒƒ์€ ์ตœ์ ์ž…๋‹ˆ๋‹ค.

์—ฐ์Šต๋ฌธ์ œ 5: ์‹คํ–‰ ๊ณ„ํš ์ฝ๊ธฐ(Reading Execution Plans)

์ด PostgreSQL EXPLAIN ์ถœ๋ ฅ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๋ž˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜์„ธ์š”:

Nested Loop  (cost=0.29..8.33 rows=1 width=64)
  ->  Index Scan using idx_emp_id on employees  (cost=0.29..4.30 rows=1 width=40)
        Index Cond: (emp_id = 42)
  ->  Seq Scan on departments  (cost=0.00..1.62 rows=1 width=24)
        Filter: (dept_id = employees.dept_id)
        Rows Removed by Filter: 49
  1. ์–ด๋–ค ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋˜๋‚˜์š”?
  2. ์–ด๋–ค ํ…Œ์ด๋ธ”์ด ์™ธ๋ถ€ (๋“œ๋ผ์ด๋น™) ํ…Œ์ด๋ธ”์ธ๊ฐ€์š”?
  3. ์ตœ์ ํ™”๊ธฐ๊ฐ€ ์™œ employees์— ์ธ๋ฑ์Šค ์Šค์บ”์„ ์‚ฌ์šฉํ•˜๋‚˜์š”?
  4. ์™œ departments์— ์ˆœ์ฐจ ์Šค์บ”์ด ์‚ฌ์šฉ๋˜๋‚˜์š”?
  5. ์ถ”์ • ์ด ๋น„์šฉ์€ ์–ผ๋งˆ์ธ๊ฐ€์š”?
ํ•ด๋‹ต 1. **์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ.** 2. **employees๊ฐ€ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค** (์ค‘์ฒฉ ๋ฃจํ”„ ์•„๋ž˜์— ๋จผ์ € ๋‚˜์—ด๋จ). ๋ฃจํ”„๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. 3. **emp_id = 42๊ฐ€ ๋งค์šฐ ์„ ํƒ์ ์ธ ๋™๋“ฑ ์ˆ ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.** emp_id์˜ ์ธ๋ฑ์Šค๋Š” ์ •ํ™•ํžˆ 1๊ฐœ ํ–‰ (rows=1)์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ „์ฒด employees ํ…Œ์ด๋ธ”์„ ์ฝ๋Š” ๊ฒƒ์€ ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค. 4. **departments๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (50๊ฐœ ํ–‰, ~2 ํŽ˜์ด์ง€).** ๊ฐ ์™ธ๋ถ€ ํ–‰ (์ด ๊ฒฝ์šฐ 1๊ฐœ๋งŒ)์— ๋Œ€ํ•ด, ์ „์ฒด departments ํ…Œ์ด๋ธ”์ด ์Šค์บ”๋ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํ–‰์ด 1๊ฐœ๋งŒ ์žˆ์œผ๋ฏ€๋กœ, ์ˆœ์ฐจ ์Šค์บ”์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์•„์ฃผ ์ž‘์€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋‹จ์ผ ํ”„๋กœ๋ธŒ์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์กฐํšŒ๊ฐ€ ๋” ๋น ๋ฅด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 5. **์ด ์ถ”์ • ๋น„์šฉ: 8.33** (PostgreSQL์˜ ๋น„์šฉ ๋‹จ์œ„๋กœ, 1.0 โ‰ˆ ์ˆœ์ฐจ ํŽ˜์ด์ง€ ์ฝ๊ธฐ). ์ด๋Š” ๋งค์šฐ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค โ€” ๋ณธ์งˆ์ ์œผ๋กœ 1๊ฐœ ์ธ๋ฑ์Šค ์กฐํšŒ + 1๊ฐœ ์ž‘์€ ํ…Œ์ด๋ธ” ์Šค์บ”.

์—ฐ์Šต๋ฌธ์ œ 6: ๋™๋“ฑ ๊ทœ์น™(Equivalence Rules)

๋™๋“ฑ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋‘ ํ‘œํ˜„์‹์ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•จ์„ ๋ณด์ด์„ธ์š”:

ํ‘œํ˜„์‹ A:

ฯƒ_{dept='CS'}(employees โ‹ˆ departments)

ํ‘œํ˜„์‹ B:

employees โ‹ˆ ฯƒ_{dept='CS'}(departments)

์–ด๋А ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๊ณ  ์™œ ๊ทธ๋Ÿฐ๊ฐ€์š”?

ํ•ด๋‹ต **๋™๋“ฑ์„ฑ ์ฆ๋ช…:** ๊ทœ์น™ 6 (์กฐ์ธ์„ ํ†ตํ•œ ์„ ํƒ ํ‘ธ์‹œ)์— ์˜ํ•ด, ์ˆ ์–ด dept='CS'๊ฐ€ departments์˜ ์†์„ฑ๋งŒ ํฌํ•จํ•˜๋ฉด:
ฯƒ_{dept='CS'}(employees โ‹ˆ departments) = employees โ‹ˆ ฯƒ_{dept='CS'}(departments)
์ด๊ฒƒ์ด ์œ ํšจํ•œ ์ด์œ : 1. ์กฐ์ธ์€ ๋ชจ๋“  ์ผ์น˜ํ•˜๋Š” (employee, department) ์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค 2. ์„ ํƒ์€ ๊ทธ ๋‹ค์Œ dept='CS'๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค 3. ๋™๋“ฑํ•˜๊ฒŒ, ๋จผ์ € departments๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ CS ๋ถ€์„œ๋งŒ ์–ป์€ ๋‹ค์Œ ์กฐ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค **ํ‘œํ˜„์‹ B๊ฐ€ ๋” ํšจ์œจ์ **์ž…๋‹ˆ๋‹ค: - ํ‘œํ˜„์‹ A: ๋ชจ๋“  ์ง์›์„ ๋ชจ๋“  ๋ถ€์„œ์™€ ์กฐ์ธ (10,000 ร— 50 ์กฐํ•ฉ ํ‰๊ฐ€), ๊ทธ ๋‹ค์Œ ํ•„ํ„ฐ๋ง. ์กฐ์ธ์€ 10,000๊ฐœ ํ–‰์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ํ•„ํ„ฐ๊ฐ€ ~200๊ฐœ๋งŒ ์œ ์ง€ (50๊ฐœ ์ค‘ 1/50์ด CS์— ์žˆ๋‹ค๋ฉด). - ํ‘œํ˜„์‹ B: ๋จผ์ € departments๋ฅผ ํ•„ํ„ฐ๋ง (50 โ†’ 1๊ฐœ ํ–‰), ๊ทธ ๋‹ค์Œ ์กฐ์ธ. ์กฐ์ธ์€ 1๊ฐœ ๋ถ€์„œ ํ–‰๊ณผ๋งŒ ์ง์›์„ ์ผ์น˜์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ์ ์€ ์ž‘์—…. ์ค‘๊ฐ„ ๊ฒฐ๊ณผ์˜ ํฌ๊ธฐ: - A: 10,000 ์ค‘๊ฐ„ ํ–‰ โ†’ ํ•„ํ„ฐ โ†’ 200 ์ตœ์ข… ํ–‰ - B: 1 ์ค‘๊ฐ„ ํ–‰ ร— employees โ†’ 200 ์ตœ์ข… ํ–‰ ์ง์ ‘

์—ฐ์Šต๋ฌธ์ œ 7: ๋น„์šฉ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”(Cost-Based Optimization)

์„ธ ํ…Œ์ด๋ธ”๊ณผ ๊ทธ ํ†ต๊ณ„๊ฐ€ ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค:

orders (o):     n = 100,000,  b = 5,000
customers (c):  n = 10,000,   b = 500
products (p):   n = 1,000,    b = 50

์กฐ์ธ ์ˆ ์–ด: o.cust_id = c.cust_id AND o.prod_id = p.prod_id

ํ•ด์‹œ ์กฐ์ธ๊ณผ M = 100 ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ์กฐ์ธ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•˜์„ธ์š”:

๊ณ„ํš A: (orders โ‹ˆ customers) โ‹ˆ products ๊ณ„ํš B: (orders โ‹ˆ products) โ‹ˆ customers

ํ•ด๋‹ต **๊ณ„ํš A: (orders โ‹ˆ customers) โ‹ˆ products** 1๋‹จ๊ณ„: orders โ‹ˆ customers (ํ•ด์‹œ ์กฐ์ธ, customers๊ฐ€ ๋นŒ๋“œ) - ๋นŒ๋“œ: 500 ๋ธ”๋ก (customers๊ฐ€ 100 ํŽ˜์ด์ง€์— ๋งž๋‚˜? ์•„๋‹ˆ์š”, 500 > 100. Grace ํ•ด์‹œ ์กฐ์ธ ํ•„์š”.) - Grace ํ•ด์‹œ ์กฐ์ธ ๋น„์šฉ: 3 ร— (5,000 + 500) = 16,500 ์ „์†ก - ๊ฒฐ๊ณผ ํฌ๊ธฐ: 100,000๊ฐœ ํ–‰ (๊ฐ ์ฃผ๋ฌธ์ด ํ•˜๋‚˜์˜ ๊ณ ๊ฐ์„ ๊ฐ€์ง) - ๊ฒฐ๊ณผ ๋ธ”๋ก: ~5,000 (orders์™€ ์œ ์‚ฌ) 2๋‹จ๊ณ„: result โ‹ˆ products (ํ•ด์‹œ ์กฐ์ธ, products๊ฐ€ ๋นŒ๋“œ) - ๋นŒ๋“œ: 50 ๋ธ”๋ก (products๊ฐ€ 100 ํŽ˜์ด์ง€์— ๋งž์Œ. ์ธ๋ฉ”๋ชจ๋ฆฌ ํ•ด์‹œ ์กฐ์ธ.) - ๋น„์šฉ: 5,000 + 50 = 5,050 ์ „์†ก - ๊ณ„ํš A ์ด: 16,500 + 5,050 = **21,550 ์ „์†ก** **๊ณ„ํš B: (orders โ‹ˆ products) โ‹ˆ customers** 1๋‹จ๊ณ„: orders โ‹ˆ products (ํ•ด์‹œ ์กฐ์ธ, products๊ฐ€ ๋นŒ๋“œ) - ๋นŒ๋“œ: 50 ๋ธ”๋ก (products๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์Œ!) - ์ธ๋ฉ”๋ชจ๋ฆฌ ํ•ด์‹œ ์กฐ์ธ ๋น„์šฉ: 5,000 + 50 = 5,050 ์ „์†ก - ๊ฒฐ๊ณผ ํฌ๊ธฐ: 100,000๊ฐœ ํ–‰ (๊ฐ ์ฃผ๋ฌธ์ด ํ•˜๋‚˜์˜ ์ œํ’ˆ์„ ๊ฐ€์ง) - ๊ฒฐ๊ณผ ๋ธ”๋ก: ~5,000 2๋‹จ๊ณ„: result โ‹ˆ customers (ํ•ด์‹œ ์กฐ์ธ, customers๊ฐ€ ๋นŒ๋“œ) - ๋นŒ๋“œ: 500 ๋ธ”๋ก (100 ํŽ˜์ด์ง€์— ๋งž์ง€ ์•Š์Œ. Grace ํ•ด์‹œ ์กฐ์ธ.) - ๋น„์šฉ: 3 ร— (5,000 + 500) = 16,500 ์ „์†ก - ๊ณ„ํš B ์ด: 5,050 + 16,500 = **21,550 ์ „์†ก** ํฅ๋ฏธ๋กญ๊ฒŒ๋„, ์ด ์ „์†ก ์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ๊ณ„ํš B๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋‚˜์€ ์ด์œ : 1. 1๋‹จ๊ณ„๊ฐ€ ์ธ๋ฉ”๋ชจ๋ฆฌ ํ•ด์‹œ ์กฐ์ธ ์‚ฌ์šฉ (๋” ์ ์€ ํƒ์ƒ‰, ๋” ๋‚˜์€ ์บ์‹œ) 2. 1๋‹จ๊ณ„์˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๊ฐ€ 2๋‹จ๊ณ„๋กœ ํŒŒ์ดํ”„๋ผ์ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋” ๋˜‘๋˜‘ํ•œ ์ ‘๊ทผ๋ฒ•: ๋‘ ์ž‘์€ ํ…Œ์ด๋ธ” (products: 50, customers: 500)์— ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋นŒ๋“œํ•œ ๋‹ค์Œ, orders๋ฅผ ํ•œ ๋ฒˆ ์Šค์บ”: **๊ณ„ํš C**: orders๋ฅผ ํ•œ ๋ฒˆ ์Šค์บ”, ๋‘ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ํ”„๋กœ๋ธŒ - ๋น„์šฉ: 5,000 + 500 + 50 = 5,550 ์ „์†ก (๋‘ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์œผ๋ฉด โ€” 550 ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, M=100์„ ์ดˆ๊ณผ) M=600์ด๋ฉด, ๊ณ„ํš C๊ฐ€ ์ตœ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

12. ์š”์•ฝ(Summary)

๊ฐœ๋… ํ•ต์‹ฌ ํฌ์ธํŠธ
์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ(Query Processing Pipeline) ํŒŒ์‹ฑ โ†’ ์ตœ์ ํ™” โ†’ ์‹คํ–‰
๋ฐ˜๋ณต์ž ๋ชจ๋ธ(Iterator Model) open/next/close ์ธํ„ฐํŽ˜์ด์Šค; ํŠœํ”Œ์ด ์—ฐ์‚ฐ์ž ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์œ„๋กœ ํ๋ฆ„
ํŒŒ์ดํ”„๋ผ์ด๋‹(Pipelining) ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ๊ตฌ์ฒดํ™” ํšŒํ”ผ
์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Selection algorithms) ์„ ํ˜• ์Šค์บ”, ์ด์ง„ ๊ฒ€์ƒ‰, ์ธ๋ฑ์Šค ์Šค์บ”; ์„ ํƒ์€ ์„ ํƒ๋„์— ์˜์กด
์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Join algorithms) NLJ, ๋ธ”๋ก NLJ, ์ธ๋ฑ์Šค NLJ, ์ •๋ ฌ-๋ณ‘ํ•ฉ, ํ•ด์‹œ ์กฐ์ธ
ํ•ด์‹œ ์กฐ์ธ(Hash join) ๋นŒ๋“œ ๋ฆด๋ ˆ์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์„ ๋•Œ ์ตœ์ : ๋น„์šฉ = b_r + b_s
์ •๋ ฌ-๋ณ‘ํ•ฉ ์กฐ์ธ(Sort-merge join) ์‚ฌ์ „ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์™€ ๋ฒ”์œ„ ์กฐ์ธ์— ์ตœ์„ 
ํœด๋ฆฌ์Šคํ‹ฑ ์ตœ์ ํ™”(Heuristic optimization) ์„ ํƒ ํ‘ธ์‹œ ๋‹ค์šด, ํˆฌ์˜ ํ‘ธ์‹œ ๋‹ค์šด, ์กฐ์ธ ์žฌ์ •๋ ฌ
๋น„์šฉ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”(Cost-based optimization) ํ†ต๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์šฉ ์ถ”์ •; ์กฐ์ธ ์ˆœ์„œ๋ฅผ ์œ„ํ•œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ
ํ†ต๊ณ„(Statistics) ํžˆ์Šคํ† ๊ทธ๋žจ, ๊ณ ์œ  ๊ฐ’, ์ƒ๊ด€๊ด€๊ณ„ โ€” ์ข‹์€ ๊ณ„ํš์— ํ•„์ˆ˜์ 
๊ณ„ํš ์บ์‹ฑ(Plan caching) ์ค€๋น„๋œ ๋ฌธ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต ํŒŒ์‹ฑ/์ตœ์ ํ™” ํšŒํ”ผ

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


์ด์ „: 07_Advanced_Normalization.md | ๋‹ค์Œ: 09_Indexing.md

to navigate between lessons