刚刚做了个10053事件跟踪我的一段小SQL
发现我本机数据库的optimizer_max_permutations = 2000 ,
如果这是Oracle的默认值的话,也就是说:当SQL超过6个表关联时,即便我们的统计信息、直方图都是最新的,生成的执行计划就不一定是最优的。
因为如果有n个表就会有n!个连接顺序。
如A B C三个表,则关联顺序有:
A + B + C
A + C + B
B + A + C
B + C + A
C + A + B
C + B + A
Oracle CBO在生成执行计划的原理是将所有可能的路径都遍历出来,计算出COST最小的一种路径选为finally plan
而optimizer_max_permutations就是用来限制CBO执行过程中最大的计算join顺序的。
所以当参数被限制为2000时
7个表的SQL,CBO就已经无法遍历所有表的关联顺序(7!= 5040),无法遍历所有的情况,就无法判断哪种情况最优。