XII. Query Optimization

Introduction

  • 基于成本的查询优化(cost-based query optimization) 具体步骤:

    • 使用 等价规则(equivalence rule) 生成逻辑等价的表达式.

    • 以不同方式标注结果表达式以获得不同的 查询计划(query plan)

    • 选择 估计成本(estimation cost) 最低的查询计划.

Equivalence Rules

  • R1:合取选择可分解:σθ1θ2(E)=σθ1(σθ2(E))\sigma_{\theta_{1} \land \theta_{2}}(E) = \sigma_{\theta_{1}}\left( \sigma_{\theta_{2}}(E) \right)

  • R2:选择可交换:σθ1(σθ2(E))=σθ2(σθ1(E))\sigma_{\theta_{1}}\left( \sigma_{\theta_{2}}(E) \right) = \sigma_{\theta_{2}}\left( \sigma_{\theta_{1}}(E) \right)

  • R3:连续多次投影只需要最后一个:ΠL1(ΠL2(E))=ΠL1(E)\Pi_{L_{1}}\left( \Pi_{L_{2}}(E) \right) = \Pi_{L_{1}}(E)

  • R4:选择操作可以与笛卡尔积和 θ\theta 连接相结合:σθ(E1×E2)=E1θE2\sigma_{\theta}\left( E_{1} \times E_{2} \right) = E_{1}\Join_{\theta}E_{2}σθ1(E1θ2E2)=E1θ1θ2E2\sigma_{\theta_{1}}\left( E_{1}\Join_{\theta_{2}}E_{2} \right) = E_{1}\Join_{\theta_{1} \land \theta_{2}}E_{2}

  • R5θ\theta 连接/自然连接可交换:E1θE2=E2θE1E_{1}\Join_{\theta}E_{2} = E_{2}\Join_{\theta}E_{1}E1E2=E2E1E_{1}\Join E_{2} = E_{2}\Join E_{1}

  • R6a:自然连接可结合:(E1E2)E3=E1(E2E3)\left( E_{1}\Join E_{2} \right)\Join E_{3} = E_{1}\Join\left( E_{2}\Join E_{3} \right)

  • R6b:设 θ2\theta_{2} 只涉及到 E2E_{2}E3E_{3} 的属性,则有 (E1θ1E2)θ2θ3E3=E1θ1θ3(E2θ2E3)\left( E_{1}\Join_{\theta_{1}}E_{2} \right)\Join_{\theta_{2} \land \theta_{3}}E_{3} = E_{1}\Join_{\theta_{1} \land \theta_{3}}\left( E_{2}\Join_{\theta_{2}}E_{3} \right)

TBD:后面的会用到吗?

Cost Estimation

  • 成本估计时不仅需考虑每个 运算符(operator) 的成本,还要考虑到中间结果的规模带来的影响.

  • 符号约定:对于关系 rr

    • nrn_{r} 表示 rr 中的元组数量.

    • lrl_{r} 表示 rr 中单个元组的大小.

    • frf_{r} 表示一个块中可以容纳的 rr 的元组数量.

    • brb_{r} 表示 rr 中的块的数量,br=nr / frb_{r} = \left\lceil {n_{r}\text{ / }f_{r}} \right\rceil

    • V(A,r)V(A,r) 表示 rr 中属性 AA 的不同取值数量

  • 直方图(histogram) 可用来表示关系中每个属性的取值分布情况.

    • 在一些规模估计中,可以通过直方图改进.否则一般按照均匀分布进行估计.

Estimation of Size

Size Estimation of Selections

  • σA=V(r)\sigma_{A = V}(r)

    • 一般情况:size~=nV(A,r)\widetilde{\mathrm{\text{size}}} = \frac{n}{V(A,r)}

    • VVrr 的主键时 size=1\mathrm{\text{size}} = 1

  • σAV(r)\sigma_{A \leq V}(r)(和 σAV\sigma_{A \geq V} 是对称的)

    • 如果可从 catalog 中获取 min(A,r)\min(A,r)max(A,r)\max(A,r),则 size~=nrvmin(A,r)max(A,r)min(A,r)\widetilde{\mathrm{\text{size}}} = {n_{r} \cdot \frac{v - \min(A,r)}{\max(A,r) - \min(A,r)}}(假设均匀分布).

    • 如果缺乏统计信息,可估计为 size~=nr2\widetilde{\mathrm{\text{size}}} = \frac{n_{r}}{2}

Size Estimation of Complex Selections

  • 中选率(selectivity) sinr\frac{s_{i}}{n_{r}} 来表示关系 rr 中的单个元组满足 θi\theta_{i} 的概率.

  • 合取 σθ1θ2θn(r)\sigma_{\theta_{1} \land \theta_{2} \land \ldots \land \theta_{n}}(r)size~=nr×s1×s2××snnrn\widetilde{\mathrm{\text{size}}} = {n_{r} \times \frac{s_{1} \times s_{2} \times \ldots \times s_{n}}{n_{r}^{n}}}

  • 析取 σθ1θ2θn(r)\sigma_{\theta_{1} \vee \theta_{2} \vee \ldots \vee \theta_{n}}(r)size~=nr×(1(1s1nr)×(1s2nr)××(1snnr))\widetilde{\mathrm{\text{size}}} = n_{r} \times \left( 1 - \left( 1 - \frac{s_{1}}{n_{r}} \right) \times \left( 1 - \frac{s_{2}}{n_{r}} \right) \times \ldots \times \left( 1 - \frac{s_{n}}{n_{r}} \right) \right)

  • 否定 σ¬θ(r)\sigma_{\neg\theta}(r)size~=nrsize~(σθ(r))\widetilde{\mathrm{\text{size}}} = n_{r} - \widetilde{\mathrm{\text{size}}}(\sigma_{\theta(r)})

Size Estimation of Joins

  • 如果 RS=R \cap S = \varnothing,则自然连接退化为笛卡尔积.size(rs)=size(r×s)=nr×ns\mathrm{\text{size}}(r\Join s) = \mathrm{\text{size}}(r \times s) = n_{r} \times n_{s},且每个元组的大小为 lr+lsl_{r} + l_{s}

  • 如果 RSR \cap SRR 的键(RSRR \cap S \subseteq R),则 size(RS)ns\mathrm{\text{size}}(R\Join S) \leq n_{s},因为对于 ss 中的每个元组都可以找到 rr 中的至多一个元组与之匹配.

  • 如果 RSR \cap SSS 中引用 RR 的外键,则 size(RS)=ns\mathrm{\text{size}}(R\Join S) = n_{s},因为 ss 中的每个元组都能外键的完整性保证能恰好找到一个元组与之匹配.

  • 如果 RS={A}R \cap S = \left\{ A \right\} 不是 RRSS 的键,则 size~=min(nr×nsV(A,r),nr×nsV(A,s))\widetilde{\mathrm{\text{size}}} = {\min(\frac{n_{r} \times n_{s}}{V(A,r)},\frac{n_{r} \times n_{s}}{V(A,s)})}.两种估计分别是假设 rr(或 ss)中的每个元组都能在另一个中找到若干个元组 与之匹配.

Problem: 练习卷1 T12

There are following assumptions about the table instructor and teaches:

  • The number of records in instructor is 4000.
  • The number of records in teaches is 8000.
  • The number of distinct values of dept_name in instructor is 20.
  • The value of salary in instructor is between 10000 and 90000.

Please estimate the size returned by the following query:

select * from instructor natural join teaches on ID
where dept_name='CS' and salary >=70000;

(A) 25  (B) 50  (C) 100  (D) 200

Answer

C.

(*) Size Estimation of Other Operations

  • 投影:size~(ΠA(r))=V(A,r)\widetilde{\mathrm{\text{size}}}(\Pi_{A}(r)) = V(A,r)

  • 聚合:size~(AgF(r))=V(A,r)\widetilde{\mathrm{\text{size}}}({{}_{A}\mathbf{g}_{F}}(r)) = V(A,r)

  • 集合操作:一般设为其上限 size~(rs)=size(r)+size(s)\widetilde{\mathrm{\text{size}}}(r \cup s) = \mathrm{\text{size}}(r) + \mathrm{\text{size}}(s)size~(rs)=min(size(r),size(s))\widetilde{\mathrm{\text{size}}}(r \cap s) = \min(\mathrm{\text{size}}(r),\mathrm{\text{size}}(s))size~(rs)=size(r)\widetilde{\mathrm{\text{size}}}(r - s) = \mathrm{\text{size}}(r)

  • 外连接:预留未找到匹配的元组的大小 size~(rs)=size(rs)+nr\widetilde{\mathrm{\text{size}}}(r\mathrm{⟕}s) = \mathrm{\text{size}}(r\Join s) + n_{r}size~(rs)=size(rs)+nr+ns\widetilde{\mathrm{\text{size}}}(r\mathrm{⟗}s) = \mathrm{\text{size}}(r\Join s) + n_{r} + n_{s}

Estimation of Number of Distinct Values

TBD:有点没看懂

  • V(A,)V(A,)

Choice of Evaluation Plans

Cost-Based Join-Order Selection

  • 如果暴力计算,则需要考虑 (2(n1))!(n1)!\frac{\left( 2(n - 1) \right)!}{(n - 1)!} 种可能,情况太多.

  • 可以考虑使用动态规划{r1,r2,,rn}\left\{ r_{1},r_{2},\ldots,r_{n} \right\}每个子集的”基于成本的最优连接顺序选择”是确定的,只需要计算一次.

  • 左深连接树(left-deep join tree):要求每个连接的右操作数都是一个关系而非中间连接的结果.

    • 许多优化器只考虑左深连接树顺序,以简化情况.

Additional Optimization Techniques

Nested Subqueries

TBD

Materialized Views

  • 物化视图(materialized view):每次重新计算 视图(view) 的代价很高,可以将视图的计算结果存储在磁盘上.

  • 推荐使用 增量视图维护(incremental view maintenance) 的策略,每次更新后只更新变化的部分.

  • 增量维护连接操作:v=rsv = r\Join s

    • 插入:rnew =rold irvnew =(rold ir)s=(rold s)+irs=vold +irsr^{\text{new }} = r^{\text{old }} \cup i_{r} \Longrightarrow v^{\text{new }} = \left( r^{\text{old }} \cup i_{r} \right)\Join s = \left( r^{\text{old }}\Join s \right) + i_{r}\Join s = v^{\text{old }} + i_{r}\Join s

    • 删除:rnew =rold drvnew =(rold dr)s=(rold s)drs=vold drsr^{\text{new }} = r^{\text{old }} - d_{r} \Longrightarrow v^{\text{new }} = \left( r^{\text{old }} - d_{r} \right)\Join s = \left( r^{\text{old }}\Join s \right) - d_{r}\Join s = v^{\text{old }} - d_{r}\Join s

  • 增量维护选择操作:v=σθ(r)v = \sigma_{\theta}(r)

    • 插入:rnew =rold irvnew =σθ(rold ir)=σθ(rold)σθ(ir)=vold σθ(ir)r^{\text{new }} = r^{\text{old }} \cup i_{r} \Longrightarrow v^{\text{new }} = \sigma_{\theta}\left( r^{\text{old }} \cup i_{r} \right) = \sigma_{\theta}\left( r^{\text{old}} \right) \cup \sigma_{\theta}\left( i_{r} \right) = v^{\text{old }} \cup \sigma_{\theta}\left( i_{r} \right)

    • 删除:rnew =rold drvnew =σθ(rold dr)=σθ(rold)σθ(dr)=vold σθ(dr)r^{\text{new }} = r^{\text{old }} - d_{r} \Longrightarrow v^{\text{new }} = \sigma_{\theta}\left( r^{\text{old }} - d_{r} \right) = \sigma_{\theta}\left( r^{\text{old}} \right) - \sigma_{\theta}\left( d_{r} \right) = v^{\text{old }} - \sigma_{\theta}\left( d_{r} \right)

  • 增量维护投影操作:需要对投影的结果进行一个计数,以确保正确的增量更新,参考下面的例子.

增量维护投影操作

R=(A,B)R = (A,B), and r(R)={(a,2),(a,3)}r(R) = \{(a,2),(a,3)\}

ΠA(r)\Pi_A(r) has a single tuple (a)(a).

If we delete the tuple (a,2)(a,2) from rr, we should not delete the tuple (a)(a) from ΠA(r)\Pi_A(r), but if we then delete (a,3)(a,3) as well, we should delete the tuple

Comments