背景自适应优化背景优化器在生成执行计划的过程中会利用基数和选择率估算的结果做代价计算,从而选择合适的执行计划。而基数和选择率会通过已有的统计信息或部分针对该查询的数据采样信息做估算,同时还存在很多缺乏统计信息的场景,会基于经验值和一些数学假设做估算。而这些信息可能因为采样精度、采样方式,经验值、假设与实际偏差大等原因导致估算非常不准。以MySQL为例,表的行数和索引列NDV信息会基于已采样的统计信息估算,索引列对常量范围的扫描行数会通过Index dive方式对具体查询做实际采样估算。对于无索引列且没有直方图信息或者列上包含表达式的Filter会基于经验值计算选择率,多个表达式之间会基于条件独立假设计算选择率。优化器基数、选择率偏差示例如下:数据准备set@@cte_max_recursion_depth=10000;CREATETABLEt1ASWITHRECURSIVEt(id,c1,c2,c3,c4,c5)AS(SELECT1,1,1,1,1,1UNIONALLSELECTid+1,c1+1,c1%20,c1%20,c1/100,c1%50FROMtWHEREc1<10000)SELECTid,c1,c2,c3,c4,c5FROMt;CREATETABLEt2ASWITHRECURSIVEt(id,c1,c2,c3,c4)AS(SELECT1,1,1,1,1UNIONALLS
...
继续阅读
(63)