PPT 08 查询优化
8. PPT 08 查询优化:先让中间结果变小¶
这一章以 第十二章 查询优化.docx 为主要讲解来源。PPT 列出等价规则和统计量;Word 笔记把每个统计量、选择率、join size、嵌套查询优化、物化视图维护讲得更具体。
先记住一句:
优化器在做的事是:
8.1 等价表达式:形式不同,输出相同¶
两个关系代数表达式等价,意思是:
最重要的不是把 15 条规则全背下来,而是抓住三种动作。
第一,选择下推:
例子:
可以变成:
先把非 CS 学生扔掉,join 时中间结果更小。
第二,投影下推:
如果后面只要:
就没必要一直带着 address/phone/birth_date 这些列跑完整个计划。
第三,把笛卡尔积加选择改成 join:
这不是只换符号,而是在提醒优化器:
8.2 一个 SQL 怎么被改好¶
SQL:
SELECT s.name
FROM student s, takes t, course c
WHERE s.ID = t.ID
AND t.course_id = c.course_id
AND s.dept_name = 'CS'
AND c.title = 'Database';
差的路线:
好的路线:
人话:
这就是查询优化的核心直觉。
8.3 统计量:优化器靠这些粗略估算成本¶
Word 笔记列了这些符号:
| 符号 | 含义 |
|---|---|
| \(n_r\) | 关系 \(r\) 中 tuple 个数 |
| \(b_r\) | 关系 \(r\) 占多少 block |
| \(l_r\) | \(r\) 中一条 tuple 的大小 |
| \(f_r\) | 一个 block 能放多少条 \(r\) 的 tuple |
| \(V(A,r)\) | \(r\) 中属性 \(A\) 有多少个不同值 |
如果关系 r 连续存放:
V(A,r) 很重要。它的直觉是:
如果:
在没有直方图的情况下,优化器会粗略假设均匀分布:
现实不一定均匀,但考试一般按均匀估。
8.4 等值选择估计:A=value 大概剩多少行¶
条件 \(A = v\)。
如果 A 是 key:结果最多 \(1\) 行。
如果 A 不是 key,且均匀分布:
例子:
估计:
8.5 范围选择估计:没有 min/max 时常按一半¶
条件 \(A \leq v\)。
如果数据库有 min/max,可以按线性比例估:
如果没有维护 min/max,常粗略估成 \(n_r / 2\)。
考试如果题目直接给选择率,比如 \(\text{selectivity} = 0.1\),那就直接:
8.6 多条件选择:AND 乘起来,OR 用容斥¶
中选率 selectivity:
如果两个条件独立:
所以:
OR 条件用容斥:
前提是条件独立。
Word 笔记强调这些公式都有独立性假设。现实中 major='CS' 和 takes Database 可能相关,但考试通常按独立算。
8.7 Join size:先看有没有 key / foreign key¶
估计 join 大小时,先问:
情况 1:没有公共属性。
情况 2:连接属性是 R 的 key。
情况 3:连接属性是 R 的 key,而且 S 的该属性是指向 R 的 foreign key。
情况 4:连接属性不是 key。
常用估计:
Word 笔记里的直觉:
考试常写:
这等价于除以较大的 \(V\)。
8.8 中间结果的 V(A, result) 怎么估¶
这类题容易显得抽象。记住两个直觉。
选择之后:
所以常估:
连接之后,如果 A 只来自 r:
如果 A 是连接属性,结果里的不同值不会超过两边较小的那个:
这类估算不是为了绝对准确,而是为了比较计划大小。
8.9 Join 顺序:最关心中间结果¶
如果要 join 五张表,理论上计划非常多,不可能全靠人枚举。
优化器会用动态规划:
两类树:
左深树更常用,因为:
启发式规则:
8.10 嵌套查询优化:能改成半连接就别一行行查¶
Word 笔记里提到嵌套查询可能很慢。
例子:
SELECT name
FROM instructor i
WHERE EXISTS (
SELECT *
FROM teaches t
WHERE t.ID = i.ID
AND t.year = 2025
);
如果天真执行:
这就是两重循环。
如果内层查询依赖外层属性 i.ID,优化器可以把它改写成半连接:
半连接 r ⋉ s 的意思:
这很适合 EXISTS / IN 这类“只问有没有”的查询。
8.11 物化视图和增量维护¶
物化视图:
好处:
坏处:
增量维护的核心:
例子 1:视图是选择:
插入一条 instructor 时:
例子 2:视图是 join:
如果 r 新插入一条 tuple:
例子 3:视图是 group by count:
插入一条 tuple:
8.12 查询优化 A4 规则¶
优化不改结果,只改执行路线。
选择下推:先筛行。
投影下推:先丢无用列。
笛卡尔积 + 选择条件 = join。
等值选择:非 key 估 nr / V(A,r),key 估 1。
范围选择:无 min/max 时常估 nr/2。
AND selectivity 相乘;OR 用 s1+s2-s1*s2。
key join:若 R.A 是 key,则结果 <= ns。
foreign key join:若 S.A -> R.A,则结果 = ns。
普通等值 join:nr*ns / max(V(A,r), V(A,s))。
join 顺序优先让中间结果小。
EXISTS/IN 常可改成半连接。
物化视图维护看差分,不重算全量。