Oracle 2005 年出了一个 30 多页的小册子,《Query Optimization in Oracle Database10g Release 2》,介绍了常见的优化器技术。
我是做 SQL 执行的,优化部分只了解皮毛,从没有系统学习过。本系列逐个学习和介绍,自我提升,也帮助他人。
这一节聊连接顺序。我们不会讲怎么去决策连接顺序,会讲做好连接顺序的决策有多难:
- N 表 join 时,表的连接顺序有 N! 种组合,N=5时,N!= 120
- 每种 join 可以选择多种连接算法,如 NLJ、HJ、MJ,PWJ 等等
- 每张表还要决策是否走索引,最多 2^N 种组合
这几样算下来,N=5 时大约有 32 * 10 * 120 ~= 3w
种路径选择。计算 3w 种组合的代价,代价非常昂贵。
通常来说,5 表 join 实际只会产生一个非常有限的 access path,详细多少依赖于各个系统的实现。优化器模块很大一部分精力就是来优化 access path 计算,这是一个数学上有解但工程上复杂的问题。不过,也没有什么黑魔法,动态规划而已。