
# 特性概述
#### 功能定义
自适应代价估计是505.1版本引入的智能优化器增强特性，包含反馈基数估计与自适应代价参数调整两个模块**。**该特性持续收集历史查询的实际执行结果（查询计划中算子级别的实际行数基数及执行时间），并基于这些数据自动训练和更新反馈基数估计模型，同时根据实际运行结果动态校准代价模型参数。反馈基数估计模型可以建立查询条件与真实基数之间的映射关系，训练完成的模型可实时应用于新查询，预测其算子基数，并结合调整后的代价模型参数，显著提升复杂场景下优化器代价估计的准确性，进而生成更优的执行计划。
#### 用户场景
在大型企业核心系统和云数据库等高负载业务环境中，复杂查询常因优化器代价估计不准而生成次优查询计划，导致大量慢SQL产生。此问题的根源在于：一方面，基数估计器难以准确预测查询结果集大小；另一方面，优化器的代价模型参数配置存在偏差。两者共同作用导致生成的执行计划次优。这些慢SQL不仅大幅增加关键业务接口响应时间，更会耗尽数据库资源，严重拖累业务成功率和系统整体可用性。
#### 规格约束
- 只支持对基表扫描算子（SeqScan、IndexScan、IndexOnlyScan、BitmapHeapScan、BitmapIndexScan）和连接算子（NestLoop、MergeJoin、HashJoin）的估计。
- 只支持以下查询条件：简单的连接条件 (col1::type =/\<\>/\>/\< col2::type，支持类型转换)，数值范围条件 (col1::type =/\<\>/\>/\< const，BETWEEN处理为大于和小于两个条件，const类型支持oid、numeric、int、float、timestamp)，简单的字符串比较条件 (col1::type =/\<\>/LIKE/NOT LIKE const，const类型支持BPCHAR、VARCHAR、TEXT) 以及IN/OR条件。
- 不支持对分区表、物化视图进行估计。
- 收集到新SQL语句信息后可能会对后续执行计划产生劣化的跳变，只有收集到足够跳变计划信息的优化器才可以逐渐收敛生成最优/较优计划。
- 反馈代价矫正后，经过矫正的智能代价参数只用于SeqScan、IndexScan、IndexOnlyScan、BitmapHeapScan、HashJoin、NestLoop和MergeJoin算子的代价估计。在优化器进行代价估计时，若一个算子及其子算子的类型和条件在反馈基数支持范围内，则会使用反馈模型的基数和矫正代价计算代价；否则会使用默认方法。
 
#### 技术架构
- 反馈基数估计模块与优化器和执行器协同工作，分为训练与估计两个阶段，如下[图1]所示。在训练阶段，该模块实时从执行器采集历史查询的计划反馈信息（主要包括执行计划树中各算子的实际基数），利用这些数据训练并迭代更新预测反馈基数估计模型，最终将优化后的模型持久化存储至系统表gs_model_warehouse中。在估计阶段，当优化器进行查询优化时，会调用该模块的预测接口，接口自动从gs_model_warehouse加载对应模型，对当前查询计划中的算子基数进行实时预测，并将高精度的预测结果回传给优化器。模型训练由后台线程异步执行，当收集的算子样本数量累积达到预设阈值，或检测到默认基数估计模型的预测误差超过特定阈值时将唤醒该线程，用户也可主动调用系统函数手动触发更新任务。
  图1反馈基数估计架构   
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590360892.png "点击放大") 

- 自适应代价参数调整的训练信息同样通过与执行器的协同进行收集，主要包含两类数据：I/O耗时信息和执行计划信息。对于I/O耗时，系统在满足特定预定义条件（如模块初始化完成且收集量未达上限）时，会在实际读取数据页的过程中精确测量并累加单次I/O操作的时间消耗以及总读取页面数，如下[图2]所示。该收集过程设有总量限制，确保对系统性能的影响微乎其微。对于执行计划信息，收集发生在查询执行结束时，前提是代价参数尚未完成训练。此时，系统会检查查询是否发生了有效的数据读取。若未读取数据，则转而收集执行计划树中关键算子（如Scan算子）的运行时统计信息，包括循环次数、处理元组数量、相关计算操作的CPU开销以及执行耗时。两种信息的收集均为低开销且受控，为核心代价模型的持续优化提供必要输入。
  图2自适应代价参数调整框架   
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620720467.png "点击放大") 
 
