Transformation of Relational Expressions
Two relational expressions are said to be equivalent if the two expressions generate the same set of tuples on every legal database instance.
- The order of tuples is irrelevant.
- we don't care if they generate different results on databases that violate integrity constraints
即我们只关心查询在正确的数据库状态下的行为,而不需要考虑它在错误状态下的表现。
** An equivalence rule says that expressions of two forms are equivalent **
合取式可以分解为多个选择运算符
选择运算符可以交换
连续投影,只有最后一个投影需要应用
e.g.
选择操作可以和笛卡尔积和theta连接操作合并
自然连接和theta连接可以交换
自然连接有结合律
theta连接有结合律,其中只包含和的属性
theta连接有分配律,假设只包含的属性
theta连接有分配律,假设只包含的属性,只包含的属性
简单来说,就是先选后连接还是先连接后选,一般来说,先选后连接的效率更高。
投影操作的分配律,假设只包含和的属性
先投影再连接,和先连接再投影,结果是一样的。
投影操作的分配律,考虑以下条件
- 和 是 和 的属性
- 是 的属性,在中,但不在 中
- 是 的属性,在中,但不在 中
先将参与连接的属性投影出来,再进行连接,最后再提取需要的属性。结果和先连接再投影是一样的。
集合的交和并操作可交换
集合的交和并操作可结合
选择操作可在集合运算上分配,如果包含和的元组
对于 和 也成立
如果只包含的元组,则
对于 也成立,但是对于 不成立
E1 = {a, b},E2 = {c, d},: 只保留a
结果不同
投影操作可分配
Statistics for Cost Estimation
-
: 关系 中的元组数量
-
: 包含关系 元组的块数量
-
: 关系 中一个元组的大小
-
: 关系 的阻塞因子 — 即一个块中能容纳的 的元组数量 tuples per block
-
: 在关系 的属性 上出现的不同值的数量;等同于 的大小
-
如果关系 的元组在物理上存储在一个文件中,则:
Histograms
Equi-width histograms
等宽直方图将值域划分为相同宽度的区间。每个区间的宽度相同,但每个区间内的元组数量可能差异很大。
特点:
- 所有区间的宽度相同
- 实现简单
- 对于数据分布不均匀的情况,可能导致某些区间元组数过多,某些区间元组数过少
- 容易受到极端值的影响
Equi-depth histograms
等深直方图将数据划分为包含相同元组数量的区间。每个区间包含大致相同数量的元组,但区间宽度可能不同。
特点:
- 所有区间包含大致相同数量的元组
- 对于偏斜数据分布有更好的适应性
- 提供更准确的选择率估计
- 计算成本比等宽直方图高
- 在数据更新时可能需要重新计算区间边界
Selection Size Estimation
选择操作的大小估计是查询优化中的关键步骤,它帮助优化器评估不同执行计划的成本。
对于等值选择操作 ,其结果大小估计为:
- 如果 是 的主键:结果大小为 1 或 0
- 如果 不是主键:结果大小约为 ,假设每种值的个数一样来估计,即其均匀分布在个值中,v值的概率为,所以结果大小为
对于范围选择操作 ,如果没有可用的直方图信息:
-
假设值均匀分布,结果大小估计为:
-
其中 和 分别是属性 在关系 中的最小值和最大值,这种估计方法采用了区间比例的方式
-
如果信息不够,则使用默认估计:
Complex Selection Conditions
对于复杂的选择条件,我们需要估计多个条件组合的选择率。
Selectivity
Selectivity of is the probability that a tuple in satisfies .
- If is the number of tuples in that satisfy , then the selectivity is
Estimation of Selectivity for Complex Conditions
- 合取条件(Conjunction):
假设条件之间相互独立,估计结果元组数为:
其中 是满足条件 的元组数。
- 析取条件(Disjunction):
估计结果元组数为:
即选择率为1减去一个都没选到的概率
-
否定条件(Negation):
估计结果元组数为:
在实际数据中,属性之间通常存在相关性,独立性假设可能导致估计不准确。一些数据库系统会维护多列统计信息来处理这种情况。
Estimation of the Size of Joins
-
笛卡尔积
包含 个元组,每个元组大小为 字节。 -
无交集的连接
如果 ,则 等价于 。
- 连接属性为主键
如果 是 的主键,则 中的每个元组至多与 中一个元组连接,
所以 的元组数不超过 的元组数。
- 连接属性为外键
如果 在 中是外键,引用 的主键,则 的元组数等于 的元组数。
反过来,如果 在 中是外键,引用 的主键,则结果等于 的元组数。
查询 student \Join takes,其中 takes 表的 ID 是外键,引用 student 的主键。
因此结果正好有 个元组。
- 如果 不是 或 的主键,
假设 中每个元组都能和 中 值相等的元组连接,
则 的元组数估计为:
即中A每一种值大概有个元组,中每个关系来匹配这些元组,所以结果为
- 如果反过来( 在 中的不同值更少),则估计为:
- 取这两个估计值中较小的那个,通常更准确。
如果有直方图,则可以对每个区间分别用类似公式估计,然后加总,得到更准确的结果。
让我们看一个具体的例子:
-
student表有 5000 条记录,每个块存储 50 条记录,共需要 100 个块 -
takes表有 10000 条记录,每个块存储 25 条记录,共需要 400 个块 -
ID在takes表中有 2500 个不同值,意味着平均每个学生选修了 4 门课程 -
ID在student表中有 5000 个不同值(是主键) -
takes表中的ID是引用student表的外键 假设我们要计算student ⋈ takes的大小估计,但不使用外键信息: -
假设
V(ID, takes) = 2500,V(ID, student) = 5000 -
两种估计方式:
-
-
-
我们选择较小的估计值 10000,这与使用外键信息得到的结果相同
Size Estimation for other operations
-
投影操作: 的估计大小为
- 因为投影操作会去除重复元组,结果大小取决于属性的不同值数量
-
聚合操作: 的估计大小为
- 因为按 A 分组后,每个不同的 A 值对应一个结果元组
-
外连接操作:
- 左外连接: leftouterjoin 的估计大小为 的大小加上 中不能连接的元组数量,即
- 右外连接: rightouterjoin 的估计大小为 的大小加上 中不能连接的元组数量,即
- 全外连接: fullouterjoin 的估计大小为
-
集合操作:
- 对于同一关系上的选择条件的并/交集:可以重写为单个选择然后使用选择大小估计
- 例如, 可重写为
- 对于不同关系上的操作:
- 的估计大小为 (上界估计)
- 的估计大小为 (上界估计)
- 的估计大小为 (上界估计)
- 所有这些估计可能不太准确,但提供了操作结果大小的上界
- 对于同一关系上的选择条件的并/交集:可以重写为单个选择然后使用选择大小估计
Estimation of Number of Distinct Values)
Selection
- 等值选择:
- 如果选择条件强制 A 取特定值(如 A=3),则
-
值集合选择:
- 如果选择条件强制 A 取特定值集合中的值,则 (集合中值的数量)
- 例如, 中
-
范围选择:(其中op是比较操作符)
- 估计
- 其中 是选择的选择率(selectivity)
-
其他情况:
- 使用近似估计:
- 即取属性在原关系中的不同值数量和选择结果大小中的较小值
Join
- 属性全部来自一个关系:
- 如果 A 的所有属性都来自于关系 ,则
- 也就是说,不会超过原关系中的不同值数量和连接结果大小
- 属性来自多个关系:
- 如果 A 包含来自 的属性 A1 和来自 的属性 A2,则:
:
- 假设A1和A2中的值完全独立
- 例如:如果A1有10个不同值,A2有5个不同值,最多可能有10×5=50个不同组合
:
- A1-A2表示A1中不在A2中的属性
- 考虑了A1和A2可能有重叠属性的情况
- 只计算A1中独有属性与A2所有属性的组合
:
- A2-A1表示A2中不在A1中的属性
- 与前一项类似,但从另一个角度考虑
- 计算A1所有属性与A2中独有属性的组合
:
- 连接结果的总元组数
- 这是一个上界,因为不同值数量不能超过元组总数
Other
- 投影操作:
- 投影不会改变属性的不同值数量
- 分组聚合操作:
- 对于分组属性,不同值数量不变
- 对于聚合值:
- 对于 MIN/MAX 函数,不同值数量估计为 ,其中 G 是分组属性
- 对于其他聚合(SUM, AVG, COUNT等),假设所有结果值都不同,使用
这些估计方法提供了查询优化器所需的基本统计信息,虽然有时可能不够准确,但在实际应用中通常足够指导查询优化器选择合理的执行计划。
Choice of Evaluation Plans
在查询优化中,选择合适的查询评估计划是关键步骤。这不仅涉及各个操作的执行成本估计,还需要考虑操作之间的交互关系。
-
单独优化的陷阱:为每个操作独立选择最便宜的算法,可能不会产生全局最优的查询计划
-
考虑交互作用的例子:
- Merge-join可能比Hash-join成本高,但它能提供已排序的输出,可能减少上层聚合操作的成本
- Nested-loop join可能提供流水线执行(pipelining)的机会,减少中间结果的物化成本
实际的查询优化器通常结合以下两种方法:
- 基于成本的搜索:
- 搜索所有可能的计划,基于成本模型选择最佳计划
- 全面但计算开销大
- 基于启发式的选择:
- 使用启发式规则快速缩小搜索空间
- 速度快但可能错过全局最优解
Cost-Based Optimization
-
连接操作数量增长:对于n个关系的连接
- 不同连接顺序的数量为
- 当n=7时,有665,280种不同顺序
- 当n=10时,超过1760亿种顺序
-
动态规划解决方案:
- 不需要生成所有可能的连接顺序
- 使用动态规划,任何子集 的最佳连接顺序只需计算一次
- 结果存储起来供后续使用,显著减少计算量
