知识卡片

代数优化的实证价值:操作顺序差十万倍代价

普通读书笔记卡

内容

关系代数表达式的等价变换不是理论上的”优雅”,而是能带来数量级差异 的真实性能收益——一个多表连接查询的具体实测数据很有说服力:查询 信息学院学生的及格选课记录,如果先对三张表(student约1000条、 course约100条、takes约20000条)做笛卡儿积再筛选,中间过程要生成 约20亿条临时数据,最终符合条件的结果只有约1900条,占比仅约百万 分之九点五——绝大多数被生成出来的中间数据从一开始就注定会被 筛选掉,却依然要为它们付出存储和计算的代价。如果调整运算顺序, 先对每张表分别做筛选(student先筛出信息学院、takes先筛出及格 成绩),再做连接,需要读写的数据总量降到约2万条——两种方案计算 结果完全相同,但所需存储空间和计算时间相差约10万倍。这个具体数字 解释了为什么代数优化不是锦上添花的可选步骤,而是查询处理里代价 收益最悬殊的一环:选择运算能剔除掉的数据比例往往极高,而笛卡儿积/ 连接运算的中间结果规模却是各参与关系规模的乘积,两者顺序颠倒的 后果是指数级放大或指数级压缩同一份计算量。这也是[[代数优化五条 实践原则]]里”选择运算尽量先做”被列为最基本一条原则的直接证据来源。

参考来源

- 位置:《数据库原理(微课版)》第10章《查询处理与优化》10.3节"代数 优化"例10-3(源文件:_epub-src/index_split_006.html) - 结论依据:原文给出具体数据"计算student与takes、course的笛卡儿积 再进行笛卡儿积计算,得到的数据共2000000×1000=2000000000 条……选择运算的结果共有1900条,占比为1900/2000000000= 0.0000095%""按图10-9(b)所示……需要读写数据总量约等于第②步的 读写数据量,约20000条数据""两种方案需要的计算时间也要相差约 10万倍",因此可以推出运算顺序对查询代价的实证影响。 - 原始内容:两种方案的计算结果相同,但因为采用不同的操作顺序与 组合,需要的存储容量相差约10万倍。两种方案需要的计算时间也要 相差约10万倍。