0
点赞
收藏
分享

微信扫一扫

【SQL 优化器技术系列】 连接顺序(Join Order)


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 计算,这是一个数学上有解但工程上复杂的问题。不过,也没有什么黑魔法,动态规划而已。


举报

相关推荐

0 条评论