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;
- ํ์(Parser): ๊ตฌ๋ฌธ ๊ฒ์ฌ, ํ ์ด๋ธ/์ด ์ด๋ฆ ํด์, ํ์ค ํธ๋ฆฌ ์์ฑ
- ๋ณํ๊ธฐ(Translator): ๊ด๊ณ ๋์๋ก ๋ณํ: ฯ_{name, dept_name}(ฯ_{salary > 80000}(employees โ_{dept_id} departments))
- ์ต์ ํ๊ธฐ(Optimizer): ๋ง์ ๋๋ฑํ ๊ณํ์ ๊ณ ๋ ค:
- ๋จผ์ ํํฐ๋ง ํ ์กฐ์ธ? ์๋๋ฉด ๋จผ์ ์กฐ์ธ ํ ํํฐ๋ง?
- salary์ ์ธ๋ฑ์ค ์ฌ์ฉ? dept_id์?
- ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ? ํด์ ์กฐ์ธ? ์ ๋ ฌ-๋ณํฉ ์กฐ์ธ?
- ์คํ ์์ง(Execution engine): ๋ฐ๋ณต์ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ ํ๋ ๊ณํ ์คํ
2. ํ์ฑ๊ณผ ๋ณํ(Parsing and Translation)¶
2.1 ํ์ฑ(Parsing)¶
ํ์๋ ๋ค์์ ์ํํฉ๋๋ค:
- ์ดํ ๋ถ์(Lexical analysis): ์ฟผ๋ฆฌ๋ฅผ ํ ํฐ์ผ๋ก ๋ถํด (ํค์๋, ์๋ณ์, ์ฐ์ฐ์, ๋ฆฌํฐ๋ด)
- ๊ตฌ๋ฌธ ๋ถ์(Syntax analysis): ์ฟผ๋ฆฌ๊ฐ SQL ๋ฌธ๋ฒ ๊ท์น์ ๋ฐ๋ฅด๋์ง ํ์ธ, ํ์ค ํธ๋ฆฌ ์์ฑ
- ์๋ฏธ ๋ถ์(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
์ฌ์ฉ ์๊ธฐ: ํญ์ ์ ์ฉ ๊ฐ๋ฅ. ์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋ ์ ํ๋๊ฐ ๋งค์ฐ ๋ฎ์ ๋ (๋๋ถ๋ถ์ ํํ์ด ์๊ฒฉ) ์ฌ์ฉ๋ฉ๋๋ค.
5.2 ์๊ณ ๋ฆฌ์ฆ A2: ์ด์ง ๊ฒ์(Binary Search)¶
ํ์ผ์ด ์ ํ ์์ฑ์ผ๋ก ์ ๋ ฌ๋์ด ์๊ณ ์ ์ด๊ฐ ๋๋ฑ ์กฐ๊ฑด์ด๋ฉด:
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) (ฯ_{ฮธโ โง ฮธโ โง ... โง ฮธโ}):
- ํ ์กฐ๊ฑด์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ๋๋จธ์ง ์กฐ๊ฑด์ ํํฐ๋ก ์ ์ฉ
- ์ฌ๋ฌ ์กฐ๊ฑด์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ์ธ๋ฑ์ค ๊ต์งํฉ(index intersection) ์ฌ์ฉ: ๊ฐ ์ธ๋ฑ์ค์์ ๋ ์ฝ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ ธ์ ๊ต์งํฉ์ ๊ตฌํ ๋ค์ ์ผ์นํ๋ ๋ ์ฝ๋ ๊ฒ์
- ์ฌ๋ฌ ์์ฑ์ ๋ํ ๋ณตํฉ ์ธ๋ฑ์ค (์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด ์ด์์ )
์ ์ธ ์ ํ(Disjunctive selection) (ฯ_{ฮธโ โจ ฮธโ โจ ... โจ ฮธโ}):
- ๋ชจ๋ ์กฐ๊ฑด์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ์ธ๋ฑ์ค ํฉ์งํฉ(index union) ์ฌ์ฉ: ๊ฐ ์ธ๋ฑ์ค์์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ ธ์ ํฉ์งํฉ์ ๊ตฌํจ
- ์ด๋ค ์กฐ๊ฑด์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ์ ํ ์ค์บ์ ์ฌ์ฉํด์ผ ํจ (ํ๋์ ๋๋ฝ๋ ์ธ๋ฑ์ค๊ฐ ์ ์ฒด ์ ๊ทผ ๋ฐฉ์์ ๋ฌดํจํ)
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)¶
์ต์ ํ๊ธฐ๋ ์ด๊ธฐ ์ฟผ๋ฆฌ ๊ณํ์ ๋๋ฑํ์ง๋ง ๋ ํจ์จ์ ์ธ ๊ฒ์ผ๋ก ๋ณํํฉ๋๋ค. ๋ ๊ฐ์ง ์ฃผ์ ์ ๊ทผ ๋ฐฉ์:
- ํด๋ฆฌ์คํฑ(๊ท์น ๊ธฐ๋ฐ) ์ต์ ํ(Heuristic (rule-based) optimization): "๊ฑฐ์ ํญ์" ์ ์ตํ ๋ณํ ๊ท์น ์ ์ฉ
- ๋น์ฉ ๊ธฐ๋ฐ ์ต์ ํ(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)
- ์ ํ์ ๊ฐ๋ฅํ ํ ์๋๋ก ํธ์ (๊ท์น 6, 7)
- ํฌ์์ ๊ฐ๋ฅํ ํ ์๋๋ก ํธ์ (๊ท์น 8)
- ์กฐ์ธ ์์ ์ ํ: ๊ฐ์ฅ ์ ํ์ ์ธ ์กฐ์ธ์ ๋จผ์ ๋ฐฐ์น
- ํ์ดํ๋ผ์ธ์ผ๋ก ์คํ๋ ์ ์๋ ํ์ ํธ๋ฆฌ ์๋ณ
์์ : ํด๋ฆฌ์คํฑ ์ต์ ํ¶
์๋ณธ:
ฯ_{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๋ฅผ ์กฐ์ธํ๋ ๋น์ฉ (๋ธ๋ก ์ ์ก)์ ๊ณ์ฐํ์ธ์:
- ๋ธ๋ก ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ (employees๊ฐ ์ธ๋ถ)
- ๋ธ๋ก ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ (departments๊ฐ ์ธ๋ถ)
- ํด์ ์กฐ์ธ (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
๋ค์์ด ๋ฐํํ๋ ํํ ์๋ฅผ ์ถ์ ํ์ธ์:
- ฯ_{salary = 75000}(employees)
- ฯ_{salary > 100000}(employees)
- ฯ_{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)
์ฐ์ต๋ฌธ์ 4: ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ ์ ํ(Join Algorithm Selection)¶
๊ฐ ์๋๋ฆฌ์ค์ ๋ํด ์ต์ ํ๊ธฐ๊ฐ ์ด๋ค ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ๊ฒ ๊ฐ์์ง ๊ฒฐ์ ํ์ธ์.
- 100๊ฐ ํ ๋ฃฉ์ ํ ์ด๋ธ์ 1000๋ง ๊ฐ ํ ํฉํธ ํ ์ด๋ธ๊ณผ ์กฐ์ธ. ํฉํธ ํ ์ด๋ธ์ ์กฐ์ธ ์ด์ ์ธ๋ฑ์ค ์กด์ฌ.
- ๋ 100๋ง ๊ฐ ํ ํ ์ด๋ธ์ ์กฐ์ธ, ๋ ๋ค ์ ๋ ฌ๋์ง ์์, ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ (1GB ๋ฒํผ ํ).
- ๋ 100๋ง ๊ฐ ํ ํ ์ด๋ธ์ ๋ฒ์ ์กฐ๊ฑด์ผ๋ก ์กฐ์ธ (r.date BETWEEN s.start_date AND s.end_date).
- ๋ ํ ์ด๋ธ์ ์กฐ์ธํ๋๋ฐ ๋ ๋ค ์ด๋ฏธ ์กฐ์ธ ์ด๋ก ์ ๋ ฌ๋์ด ์์.
ํด๋ต
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
- ์ด๋ค ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋์?
- ์ด๋ค ํ ์ด๋ธ์ด ์ธ๋ถ (๋๋ผ์ด๋น) ํ ์ด๋ธ์ธ๊ฐ์?
- ์ต์ ํ๊ธฐ๊ฐ ์ employees์ ์ธ๋ฑ์ค ์ค์บ์ ์ฌ์ฉํ๋์?
- ์ departments์ ์์ฐจ ์ค์บ์ด ์ฌ์ฉ๋๋์?
- ์ถ์ ์ด ๋น์ฉ์ ์ผ๋ง์ธ๊ฐ์?
ํด๋ต
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)
์ฐ์ต๋ฌธ์ 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