背景
基数估计任务是在一个查询执行之前预测其基数,基于代价的查询优化器(Cost Based Optimizer)将枚举所有可能的执行计划,并利用估计的基数选出期望执行代价最小的计划,从而完成查询优化的任务。
然而,传统的基数估计方法,例如PostgreSQL基于直方图(Histogram)的方法,往往采用简单的独立性假设、均匀假设,用有限的统计信息来预测查询的基数,导致了较大的基数估计误差。事实上,现实中的数据是复杂的、富有关联的,传统的基数估计方法往往不能刻画数据的复杂分布,产生巨大的基数估计误差从而诱发大量的次优计划甚至灾难性计划。
为此,研究者们近年来将目光投放于基于机器学习的查询优化方法,利用机器学习的基数,来完成基数估计这个传统方法难以很好解决的问题。现有的基于机器学习的方法主要可以分为如下两大类:
- **Query-driven:即查询驱动。**直接学习查询特征到其基数的映射,i.e. $ f_\Theta(Q) \to \text{Card} 。通常是一个回归模型,但需要大量的查询及其真实基数作为训练集 。通常是一个回归模型,但需要大量的查询及其真实基数作为训练集 。通常是一个回归模型,但需要大量的查询及其真实基数作为训练集{ <Q, \text{Card}>}$。
- **Data-driven:即数据驱动。**与查询驱动的思想不同,数据驱动并不直接学习查询的基数,而是学习底层数据的分布,并用这个分布来回答查询的基数。例如,一个具有属性 { A 1 , A 2 , ⋯ , A n } \{A_1, A_2, \cdots, A_n\} { A1,A2,⋯,An}的表 T T T,可以看作是定义在 Π i = 1 n d o m ( A i ) \Pi_{i=1}^n dom(A_i) Πi=1ndom(Ai) 上的多元概率分布 P T ( A 1 , A 2 , ⋯ , A n ) P_T(A_1, A_2, \cdots, A_n)