GaussDB 反馈自适应优化器
GaussDB反馈自适应代价优化器通过查询反馈动态矫正错误的估计基数或者是代价模型,实现优化器能够及时随着负载变化,数据变化以及运行环境变化做自适应调整,其中主要依赖反馈基数估计和反馈代价矫正两个关键特性。
(1)GaussDB反馈式优化器会采集数据库系统中SQL查询计划算子运行信息,当前包括Join算子和Scan算子,运行信息包括算子类型,算子结果行数,以及该算子所有孩子节点的查询条件(针对Join);针对每种算子,依据Join条件和基表过滤条件形成的等价类计算出算子的哈希值,该哈希值相同表示算子的模式(pattern)是等价的,只有模式等价的算子才能共用同一个基数估计模型;历史算子中抽取出查询条件以及对应的数值,用查询条件构造出超方体,超方体的维度对应查询模式的每个条件,而其面积由实际条件的上下限构成;接着从每个查询超方体中均匀采样一定数量的点,利用K-means聚类算法找出K个中心点,然后以每个点作为中心,最近的若干点的距离均值作为每个维度的变长构造一系列的采样超方体;最后假设每个采样超方体内部是均匀分布,每个查询由不同的均匀分布加权叠加,通过拟合每个查询的选择率学习出权重,从而获得均匀分布模型参数。整个过程可以使用命令手动触发,也可以依赖后台线程自动触发;查询优化阶段,优化器首先根据当前估计算子的特征哈希值抽取对应的反馈基数模型,根据当前的查询条件范围选择是否选用当前模型;否则利用数据驱动模型。接着优化器利用反馈自适应确定的代价模型参数,结合基数输入计算出算子代价,并且支撑当前优化器计划路径决策。
(2)代价参数矫正模块会采集数据库系统中的缓存读取IO时间和SQL查询计划算子运行信息,当前收集的包括SeqScan算子,矫正的参数包含cpu_tuple_cost, cpu_index_tuple_cost, cpu_operator_cost, seq_page_cost, random_page_cost。每个设备上的数据库各自维护自己的代价参数。通过在每个页面读取开始和结束时计时,估算出平均每个页面读取的IO时间。进一步,通过调用计划开始前后的缓存信息,筛选出对没有发生缓存读取的SQL语句中(在TPC-H和JOB跑到第二轮之后占比90%以上),对其中的SeqScan算子进行数据采集,建立CPU参数和运算时间的回归模型,进而给出CPU参数的估计。查询优化阶段,优化器对有反馈基数模型的路径(即路径涉及到的每个基数估计都来自反馈基数模型),利用矫正的代价参数和AQO基数,额外维护一个新代价,但也保留生成该路径的结果集的最优旧代价。对每个有反馈基数模型的子路径,使用新代价选择最优执行方案;如果路径连接中至少有一方的基数不来自反馈基数,则停止维护新代价,并且在之后的连接中使用旧代价,确保不会劣化。

浙公网安备 33010602011771号