在PolarDB中,行数评估是通过对表的统计数据、基数估计以及算子代价模型来进行估算的。
统计信息:PolarDB的统计信息以逻辑表为单位,包括了逻辑表的行数、列的NDV(Number of Distinct Values)值、列的空值信息以及等高直方图信息。当用户执行ANALYZE TABLE命令或者后台的auto analyze线程自动发起统计信息收集时,PolarDB会通过采样数据来计算统计信息。
基数估计:基数估计会利用各表、列的统计信息,估算出各算子的输入行数、选择率等,提供给算子代价模型,从而估算出查询计划的代价。例如,在Join操作中,LeftRowCount乘以RightRowCount,然后除以两者中较大的基数,可以得到Join操作的输出行数。
代价模型:PolarDB使用代价模型来描述物理执行计划的代价,通常用(CPU、Memory、IO、Net)四元组来描述。每个算子都会有自己的代价模型,而这个模型的输出(即代价)是所有算子代价的总和。最终,优化器会根据这些代价信息,选择代价最小的执行计划来执行SQL操作。
综上所述,PolarDB中的行数评估是基于统计信息和基数估计,结合代价模型综合得出的,目的是为了优化器能够选择一个性价比最高的执行计划。