COOOL_ A Learning-To-Rank Approach for SQL Hint Recommendations【论文内容翻译】

标题:COOOL: SQL Hint推荐的学习排序方法

***摘要***:查询优化是每个数据库管理系统(DBMS)的关键部分,因为它决定了查询执行的效率。许多工作已经将机器学习(ML)技术引入到成本建模、基数估计和端到端学习优化器中,但由于训练时间长、缺乏可解释性和集成成本,它们很少被证明是实用的。最近的一项研究提供了一种实用的方法,通过推荐每个查询提示来优化查询,但它存在两个继承的问题。首先,它遵循回归框架来预测每个查询计划的绝对延迟,这是非常具有挑战性的,因为某个查询的查询计划的延迟可能跨越多个数量级。其次,它需要为每个数据集训练一个模型,这限制了训练模型在实践中的应用。在本文中,我们提出了COOOL通过Learning-To-Rank预测查询计划的Cost Orders来与DBMS合作。COOOL没有估计绝对成本,而是使用ranking-based的方法来计算查询计划成本的相对排名分数。我们证明了COOOL在区分具有不同延迟的查询计划方面在理论上是有效的。我们在PostgreSQL上实现了COOOL,在join-order-benchmark和TPC-H数据上的大量实验表明,COOOL在单数据集任务上优于PostgreSQL和最先进的方法,在多数据集任务上优于unified model。我们的实验也从representation learning的角度揭示了为什么COOOL优于回归方法,这可能会指导未来的研究。

介绍

查询优化的目标是从庞大的搜索空间中以足够的精度为每个查询选择具有最低延迟的最佳候选计划。

查询优化已经研究了几十年[31],并且仍然是一个活跃的研究领域[35]。人们提出了各种基于ML的研究思路:成本建模、基数估计、端到端查询优化等,其中最实用的方法是Bao[23]。Bao是一个利用树卷积神经网络[27]和Thompson sampling[33]来推荐SQL提示的查询优化系统。Bao在端到端查询优化的实用性方面取得了显著的进步,但它存在两个继承自以前模型的问题[19,25,32,41,42]。

  1. 首先,Bao遵循了与前面工作相同的基本假设,即模型需要预测每个计划的准确成本,以选择成本最小的计划。它首先在一个回归框架下估计每个候选计划的绝对成本,然后选择最小估计的计划。虽然有时需要准确估计成本,但对于现有模型来说,这是非常具有挑战性的[1,36,37]。因此,模型可能会做出不准确的预测,并选择具有高延迟的查询计划。

  2. 其次,Bao为每个数据集分别训练一个模型,并在相应的数据集上对模型进行评估。数据集因DBMS实例而异,并且为每个数据集训练和维护单个模型的成本很高。因此,模型的可泛化性在实际场景中是令人渴望的。

为了解决这些问题,我们提出了COOOL利用Learning-To-Rank(LTR)技术预测查询计划的Cost Orders来与DBMS合作。COOOL是在现有DBMS的基础上设计的,以推荐query-specific hints,以方便实际使用。为了获得一个unified model来优化来自不同数据集的查询,我们采用data/schema不可知的TCNN作为query plan cost ranking scorer来预测候选计划的相对cost orders。为了继承Bao的优势,我们做了类似的假设:我们假设预定义了一组有限的hint sets,并且所有hint sets都产生语义上等价的查询计划。

与预测成本的回归方法相比,LTR方法学习不同提示集的相对分数。LTR方法比以前的端到端查询优化工作中的回归方法具有优势[23,25,40],原因如下:

  • 计划执行延迟从几毫秒到数千秒不等。一个查询的两个语义等效计划的树结构稍有不同,就可能导致执行延迟的巨大差异。

  • 对于端到端查询优化来说,不需要准确估计每个查询计划的延迟,因为优化器只需要选择其中一个来执行。对查询计划延迟顺序的良好预测足以进行查询优化,这正是LTR的目标。

LTR是一种监督学习框架,用于训练用于排序任务的模型。LTR方法主要有三种:pointwise, pairwise, listwise。大多数pointwise方法与回归相同。pairwise方法关注两个items之间的相对顺序,而listwise方法关注整个列表中items的顺序。这三种方法可以应用于大多数现有的模型,例如神经网络,唯一的区别在于损失函数。在这项工作中,我们利用广泛使用的树卷积神经网络(TCNN)[23,27,40]作为底层模型。为了训练LTR模型,可以使用延迟的顺序作为标签,对于查询计划延迟的大范围数量级,这可能比回归模型更健壮。通过将绝对成本估计问题转化为相对成本顺序预测,COOOL可以利用LTR技术来训练TCNN,使输出告诉我们哪个计划是最好的。具体来说,我们分别研究了pairwise策略和listwise策略在SQL hints推荐中用于查询优化的性能,因此COOOL有两种实现:COOOL-pair和COOOL-list。通过这种方法,我们还可以训练一个统一的模型来改进来自不同数据集的查询计划。

我们的实验表明,COOOL可以在各种设置下持续改进查询计划,比PostgreSQL实现高达6.73倍的加速。此外,我们还从representation learning[44]的角度研究了回归框架和排序策略。我们证明了回归方法训练的模型在plan embedding space中存在a dimensional collapse[9]。而COOOL在使用相同plan embedding space时没有a dimensional collapse。dimensional collapse将限制ML方法构建统一的模型,因为在不同的数据集中collapsed dimensions可能是不同的。

此外,Bao需要更多的工作来实现,因为它完全集成到PostgreSQL中,而我们是在PostgreSQL之上构建的,这使得COOOL很容易迁移到其他dbms。

文章的贡献如下:

  • 我们提出了一个学习模型COOOL,通过LTR技术与DBMS合作预测查询计划的成本顺序,为查询优化提供更好的SQL hints。据我们所知,COOOL是第一个端到端查询优化方法,它维护一个统一的模型来优化来自不同数据集的查询。

  • 我们从理论上证明了在优化损失函数时,COOOL可以区分具有不同延迟的查询计划,并从表示学习的角度验证了COOOL优于回归方法。

  • 在join-order-benchmark和TPC-H上的综合实验表明,COOOL在多个维度的评价标准上都优于PostgreSQL和最先进的方法。

前言

2.1 Task Definition and Formalization

  • Q - the set of queries,H = {HS_{1}, HS_{2}, . . . ,HS_{n}} - the set of 𝑛 hint sets,

    每个提示集HS_{i}∈H只包含布尔标志查询提示(例如,启用哈希连接,禁用索引扫描),对于任意查询q∈Q和i∈{1,2,...,n},traditional optimizer 𝑂𝑝𝑡可以利用the hint set HS_{i}生成相应的计划树t_{i}^{q}t_{i}^{q} = 公式1。

T^{q} = {t_{1}^{q},...,t_{n}^{q}} - 查询𝑞的候选计划集,T^{q}中的查询计划在语义上是等价的,但可能具有不同的执行延迟。

  • 模型𝑀是一个函数,它将候选计划树作为输入,并为计划树生成分数。s_{i}^{q} = 公式2,其中\vec{\theta }为待训练模型的参数。

  • 然后,query execution engine选择LTR场景中预测排名得分最高的计划。\hat{HS}^{q} = 公式3
    式中,\hat{HS}^{q}为the hint set with the maximum score,对应最小的估计代价。

2.2 Learning-To-Rank (LTR)

在LTR上下文中,H是items的集合,目标是对任意𝑞∈𝑄从H中推荐最优item。更具体地说,LTR是在{s_{i}^{q}}'s上定义一个损失函数,以便底层模型𝑀可以得到适当的训练,以预测查询计划的顺序。在本文中,t_{i_1}^{q} > t_{i_2}^{q} 意味着计划t_{i_1}^{q}优于t_{i_2}^{q} (具有更低的延迟)。给定一个查询𝑞∈𝑄,让\sigma_{q}= t_{i_1}^{q} > t_{i_2}^{q} > ... > t_{i_n}^{q} 表示查询计划的总顺序取决于它们的延迟。t_{i_1}^{q}有最低延迟,t_{i_n}^{q}有最高延迟。

Plackett-Luce模型(PL)[22,28]是最流行的离散选择模型之一,后来被用作信息检索中的listwise损失函数[20]和分类任务中的softmax函数[8]。在SQL hints推荐的上下文中,我们提供PL的定义如下。给定任意𝑞∈𝑄,则\sigma_{q}的概率是 公式4 Pr_{PL}(\sigma_{q};\vec{\theta })= 。式中{s_{i}^{q}}'s为公式2中参数\vec{\theta }定义的函数。

假定多个查询的排名是独立的。因此,多个排名的概率仅仅是每个个体排名的概率的乘积。任何pairwise比较的边际概率Pr_{PL}(t_{i}^{q} > t_{j}^{q};\vec{\theta })=公式5。

2.2.1 Listwise Loss Function

给定训练数据{\sigma_{q}|∀𝑞∈𝑄},listwise损失函数就是简单的负对数似然函数: L_{list}(\vec{\theta }) = 公式6。其中Pr_{PL}(\sigma_{q};\vec{\theta })如公式4定义。

这个listwise的损失函数也与listMLE损失[38]相符。[38]证明了这个损失函数是一致的,这意味着当数据集的大小趋于无穷大时,学习到的排序收敛到最优排序。

2.2.2 Pairwise Loss Function

为了应用pairwise损失函数,需要将所有𝑞∈𝑄的full rankings(\sigma_{q})转换为pairwise比较。这一过程称为rank-breaking[2]。rank-breaking方法定义了如何将full rankings转换为pairwise比较。Basic breakings包括full breaking, adjacent breaking等[2]。full breaking意味着从一个排序中提取所有pairwise比较,而adjacent breaking意味着只提取相邻的pairwise比较。例如,给定一个排名t_{1}t_{2}t_{3},full breaking将其转换为(t_{1}t_{2},t_{1}t_{3},t_{2}t_{3}),而adjacent breaking将其转换为(t_{1}t_{2},t_{2}t_{3})。虽然adjacent breaking简单而合理,但[2]证明adjacent breaking会导致参数估计不一致,这意味着即使使用无限的数据训练模型,也可能无法做出无偏的预测。Other breakings更为复杂,超出了本文的范围。

pairwise目标函数为L_{pair}(\vec{\theta })=公式7。Pr_{PL}(\pi_{j};\vec{\theta })如公式5定义。模型参数可以通过最大化𝐿(\vec{\theta })来估计。

这相当于根据式(5)最大化the composite marginal log likelihood。[14]和[47]证明了在正确的rank breaking方法下,\vec{\theta }可以被有效地估计出来。从full breaking中提取所有pairwise比较,是正确的breaking方法之一。

COOOL模型

COOOL的核心组件是一个neural plan ranking scorer,用于估计候选计划的相对排名分数。

在训练阶段,我们执行查询计划并收集其性能指标作为训练数据。然后,我们使用pairwise或listwise方法来实现对ranking scorer的训练。在推理阶段,当用户提交查询时,传统优化器将利用相应的提示集生成𝑛个查询计划。接下来,scorer将计算每个计划的相对排名分数,并向执行引擎推荐最优计划。COOOL的数据流图如图1所示。

  • Data Collection:我们的方法是在标准的监督学习范式中训练的。对于给定的查询,我们利用底层传统优化器生成𝑛个查询计划,这些计划关联为每个查询提供的提示集H。然后我们将它们发送到执行引擎,并记录观察到的每个查询计划的执行性能。收集到的数据用于训练neural ranking scorer,并且训练阶段与DBMS分离。

  • Cost Order Estimation:为了以最小的估计延迟执行最优计划,我们需要向DBMS推荐其相应的提示集。scorer以计划树作为输入,输出计划的排名分数,通过对所有候选计划的分数进行排序,可以获得估计的延迟顺序。具体来说,我们首先将输入计划树的节点转换为向量,然后将向量树发送到由TCNN构建的plan embedding model中。最后,我们将plan embedding发送到多层感知器(MLP)中,以计算计划的估计分数。在训练阶段,我们使用收集到的计划和延迟数据来训练模型。因此,它可以通过延迟估计计划的相对顺序,并在推理阶段与DBMS合作改进查询计划。

  • Assumptions and Comparisons:我们假设将每个提示集应用于给定查询将生成语义上等效的计划。此外,提示应用于整个查询而不是部分计划。虽然允许细粒度的提示(例如,允许特定表之间的嵌套循环连接,而其他表则不允许)是可用的,但它将带来指数级的候选计划搜索空间,这将显著增加训练和推理开销。出于实用性的考虑,我们做了和BAO一样的假设。

Bao需要更多的工作来实现,因为它完全集成到PostgreSQL中,而我们是在PostgreSQL之上构建的,这使得COOOL很容易迁移到其他dbms。此外,我们进一步维护了一个统一的模型来优化来自不同数据集的查询,这在以前的端到端查询优化研究中还没被提及。

COOOL 的 hint 推荐

首先,我们引入了以查询计划为输入并计算相对排序分数的cost order estimation model。接下来,我们利用pairwise和listwise方法来形式化训练循环。最后,对ranking losses如何影响最佳计划的选择进行了理论分析。

4.1 Cost Order Estimation

每个提示集对应一个查询计划树,因此为给定查询推荐最优提示集就是选择成本排名分数最大的计划树,如公式(3)所示。与[23,25,40]类似,我们使用TCNN获得plan embeddings,并利用MLP计算ranking scores。

  • Plan Tree Vectorization:我们可以使用underlying optimizer提供的EXPLAIN命令获得计划树文本,如公式(1)所示。首先,我们需要将计划树中的每个节点转换为一个向量。与[23]相同,我们使用数据/模式无关的编码方案,该方案仅包含underlying traditional optimizer提供的操作符类型、基数和成本的单热编码。然后,我们将原始树转换为二叉树,以方便树卷积操作。

  • One-hot Node Operation Type Encoding:我们总结了计划树中所有操作的类型(nested loop, hash join, merge join, seq scan, index scan, index only scan, and bitmap index scan),并对这七种操作进行编号。然后,我们为每个节点创建一个具有位数类型编号的向量,并将每个节点对应的类型的位设置为高位(1)。例如,E_{o}(𝑣)是一个one-hot encoding节点𝑣和E_{o}(𝑣)[𝑖]= 1表示节点𝑣是第𝑖-th个操作类型,E_{o}(𝑣)其余元素是0。one-hot节点类型编码虽然简单,但能够提取平面树中的结构信息。

  • Tree Nodes Vectorization:除了操作信息外,每个节点还可以包含成本和基数。它可以从多个传统优化器和学习模型中获取成本和基数,但为了简单起见,我们只使用从underlying traditional optimizer中获得的两个值。因此,节点编码是operation type encoding, cardinality和cost的连接,即E(𝑣)= Concat(E_{o}(𝑣),Cost(𝑣),Card(𝑣)),其中Cost(𝑣)和Card(𝑣)分别是traditional optimizer估计的cost和cardinality。对plan tree中的节点进行节点编码,得到一棵矢量化的plan tree。

  • Tree Structure Binarization:计划树中的一些节点可能只有一个子节点,例如,用于聚合和排序操作的节点。为了方便树卷积运算,我们将非二叉树转换为二叉树,在每个只有一个子节点的节点上添加一个伪子节点Null,伪子节点的cost和cardinality为0。然后将原计划树𝑡转化为矢量树𝑝。

4.1.1 TCNN Plan Embedding

TCNN在[27]中被提出,用于在编程语言处理中处理树结构数据。TCNN在[25]中首次被引入到plan representation中,在[23,40]中得到了很好的建立。在本节中,我们将简要介绍如何使用TCNN表示计划,更多技术细节请参阅[25,27]。

在执行引擎中执行原始计划树期间,一个节点的计算依赖于其子节点的结果。基于这一事实,plan embedding方法应体现递归性质,以获得适当的inductive bias[26]。

为了与计划执行保持一致,自然需要模型同时捕获节点及其子节点的特征。具体来说,表示𝑙(𝑣)和𝑟(𝑣)分别是节点𝑣的左、右子节点。向量E(𝑣)中的统计cost/cardinality信息与E(𝑙(𝑣))和E(𝑟(𝑣))密切相关。树卷积可以很自然地解决这个问题。

树卷积类似于图像卷积,它具有二叉树结构滤波器来捕获局部特征。我们以一个树卷积滤波器为例,该滤波器中有三个权重向量,分别是𝑤,w_{l}w_{r}。对当前节点E(𝑣)进行树卷积可以得到新的表示, 公式8: E(𝑣)' = 公式8。其中,σ是一个非线性激活函数,⊙是一个点积运算。节点𝑣的新表示包含其子节点的信息。通过堆叠树卷积操作,潜在表示将有一个更大的接受域,而不仅仅是能够与子节点交互。通过这种方式,模型能够捕获表示一个节点的计划执行长链的high-level features。树卷积操作的输出是一棵与输入结构相同的树,因此我们采用动态池化方法聚合所有节点的潜在表示来表示查询计划。综上所述,我们可以通过\vec{p}= TCNN(𝑝)得到平面嵌入,其中\vec{p}\mathbb{R}^{h} 为平面表示向量,为plan tree embedding空间的大小。

4.1.2 Ranking Score Computation.

最后,我们可以利用plan embedding来计算相对排名分数。我们使用一个简单的MLP,将plan embedding vector作为输入,输出一个scalar(标量)作为排名分数𝑠,即𝑠= MLP(\vec{p})。在MLP中堆叠全连接层和非线性激活函数可以增强representation ability,这种做法在查询优化中被广泛采用[25,40]。为了简单起见,我们添加了一个隐藏层和一个激活函数。通过对所有候选计划的ranking scores进行排序,得到cost orders。

4.2 Learning-To-Rank Training Loop

训练循环由三部分组成:data collection和deduplication、label mapping和pairwise data extraction、模型训练和评估。

4.2.1 Data Collection and Deduplication.

Q_{train}表示训练查询集。我们通过传统的优化器为每个查询𝑞∈Q_{train}生成𝑛个计划,如公式(1)所示,然后将计划发送给执行引擎,并记录每个数据点(query =𝑞,plan =𝑡,latency =𝑙)。这会存在重复的查询计划,因为对于给定的查询,不同的提示可能导致相同的查询计划。我们删除了pairwise和listwise训练循环的重复查询计划。

4.2.2 Label Mapping and Pairwise Data Extraction

因为较低的延迟表示更好的计划,所以我们使用每个查询计划延迟的倒数作为标签来翻转查询计划的顺序。任何其他翻转顺序的映射函数都是等效的,因为只有顺序最重要。

在label mapping之后,我们得到一个查询计划列表,按照每个查询的延迟倒数排序。为每个列表n^{q}查询计划(n^{q}≤𝑛是重复数据删除后),我们提取所有 \binom{n^{q}}{2} pairwise比较的pairwise数据 𝑃 = {\pi_{1}, \pi_{2}, ..., \pi_{m}},对于任意𝑗∈{1,2,…,𝑚},\pi_{j} = t_{i_{1}}^{q_{j}} > t_{i_{2}}^{q_{j}}

4.2.3 Model Training and Evaluation

我们通过最大化pairwise或listwise log-likelihood函数来计算模型参数\vec{\theta }。具体来说,对于listwise方法,通过最小化公式(6)中定义的listwise loss来计算模型参数\vec{\theta }。对于pairwise方法,通过最小化公式(7)中定义的pairwise loss来计算模型参数\vec{\theta }。详细信息请参见2.2节。

在推理阶段,我们使用学习到的模型计算每个候选计划的分数,并对分数进行排序以获得相应的顺序,然后为每个查询选择估计的最佳计划执行。

4.3 Theoretical Analysis

在本节中,我们将简要分析COOOL如何从不同查询计划的延迟顺序中学习。为了说明这一点,我们考虑查询计划{t_{1}t_{2},…,t_{n}}具有相应的延迟{l_{1}l_{2},…,l_{n}}对于给定的查询𝑞∈𝑄。我们的目标是用这个模型选出最好的一个计划。在训练阶段,他们有不同的初始分数{s_{1}s_{2},…,s_{n}}。在不丧失一般性的前提下,我们假设l_{1} >l_{2} >…>l_{n}

4.3.1 Pairwise Approach

我们从pairwise方法开始,因为它比listwise方法更简单、更直观。在pairwise方法中,每一行数据由两个查询计划组成,用于某个查询𝑞∈𝑄,分别用t_{i_{1}}^{q}t_{i_{2}}^{q}表示。在不失去一般性的前提下,我们假设它们对应的延迟l_{i_{1}} >l_{i_{2}}。让s_{i_{1}}s_{i_{2}}表示两个查询计划的模型输出,并定义𝛿=s_{i_{2}}s_{i_{1}}。为简单起见,我们将重点放在这对查询计划上,并让L_{pair}^{q,i_{1},i_{2}}表示这对查询计划上的损失。我们有L_{pair}^{q,i_{1},i_{2}} = −𝛿 + ln(1 + exp(𝛿))(公式具体如下),其中s_{i_{1}} = 0,因为损失只取决于𝛿。

 L_{pair}^{q,i_{1},i_{2}}关于𝛿的偏导数,\frac{\partial L}{\partial \delta } = −1 + (exp(𝛿) / (1 + exp(𝛿))) < 0,公式9。

这意味着𝛿的增加导致损失函数L的减小。在训练过程中,𝛿趋于上升,而损失函数L趋于最小化,这是期望的结果。

4.3.2 Listwise Approach

我们感兴趣的是相邻查询计划的模型输出之间的差异,即\delta _{i}=s_{i+1}s_{i} 对所有 i∈{1,2,…,𝑛−1}。为方便起见,我们定义\delta _{0} = 0。然后对于所有的i={1,2,…,𝑛},我们有s_{i} = s_{1}\Sigma \delta _{j} (具体如下)

listwise方法的损失函数可以写成:L_{list} = (具体如下)。式中,将公式(4)代入公式(6),得到第一个等式;将s_{i}代入s_{1} + \Sigma _{j=0}^{i-1} (\delta _{i}),得到第二个等式;第三个等式是通过分子分母同时除以exp(s_{1})得到的,因为exp(s_{1})> 0。最后一个等式来自于ln()函数的性质。

现在,我们计算L_{list}\delta _{i}的偏导数,对于任意i∈{1,2,…,𝑛−1},\frac{\partial L_{list}}{\partial \delta_{i}} = 公式10。不等式成立,因为当1≤i≤𝑛−𝑗时,我们有不等式(具体如下,公式10下面的公式)。这意味着对于每个i∈{1,2,…,𝑛},\delta _{i}的增加导致损失函数L_{list}的减小。在训练过程中,当损失函数L_{list}趋于最小时,\delta _{i}趋于上升,这是期望的结果。

综上所述,通过最小化L_{list}L_{pair},不同查询计划的排序分数之间的差异趋于增大,这意味着我们的方法能够区分出最佳计划。

实验

为了全面评估COOOL的性能,我们在单实例、工作负载转移和维护一个模型(统一模型)三种场景下进行了实验。第一个场景在机器学习查询优化中很常见,它指的是为每个数据集学习一个模型。其他的在相关研究中很少被关注,但对于DBMS中的机器学习模型部署至关重要,特别是最后一个场景意味着训练一个模型来改进来自不同数据集的查询计划。

因此,我们进行了大量的实验,主要回答以下研究问题(RQs):

  • RQ1:就总查询执行延迟和改进慢速查询而言,与基线方法相比,COOOL能否实现最佳性能?

  • RQ2:它是否能够直接将模式无关模型转移到另一个数据集?

  • RQ3:所提出的方法能否通过维护统一的模型来改进来自不同数据集的查询计划?

  • RQ4:这些实验能否提供一些关于为什么COOOL方法比Bao方法更好的见解?

5.1 Experimental Setup

  • Datasets:开源数据集(IMDB, TPC-H)

  • Workloads:对应的工作负载(JOB、TPC-H)

  • Baseline Methods:PostgreSQL 、Bao

Model Implementation:我们使用三层TCNN,通道数分别设置为{256,128,64},平面嵌入空间长度为64,MLP的隐藏大小设置为32。激活函数为Leaky ReLU[39],优化器为Adam[15],初始学习率为0.001,我们对训练损失应用10个epoch的早期停止机制,我们保存在验证集上表现最好的模型,并在测试集上报告结果。

Device and Configuration:

Evaluation Protocol:

5.2 Single Instance Experiments (RQ1)

在本节中,我们将重点讨论单实例场景中不同优化方法的性能。

Evaluation Criteria for Model Performance:我们不是均匀随机地选择测试数据,而是在评估标准的多个维度上对模型进行评估,因此我们有多种方法来测试数据的选择。首先,我们考虑两种现实场景:临时场景和重复场景。

  • ad hoc scenario:在临时场景中,查询来自未包含在训练数据中的模板。

  • repetitive scenario:在重复场景中,测试数据中的查询与训练数据中的查询“相似”,但不相同。这里的“相似”意味着查询来自与训练数据中相同的模板。在实践中,我们将每个模板中的一个或多个查询作为测试集,并将剩余的查询保留在训练集中。

对于这两种场景,我们综合评估了模型在the random and the tail latency evaluation protocols,因此我们分别进行了random templates/queries selection和slow templates/queries selection,分别缩写为rand和slow。表1总结了单例实验的总体结果。observations:表1、表2、图3。

总之,我们观察到COOOL在加速总体查询执行、缓解单个查询性能回归和优化慢速查询方面比Bao具有优势和竞争力。此外,尽管COOOL-list在总体查询执行延迟加速方面优于COOOL-pair,但它在避免单个查询回归方面表现不佳。

5.3 Workload Transfer Investigation (RQ2)

众所周知,实例优化模型在另一个工作负载上的性能可能很差,因为它没有从不可见的工作负载中学习模式。因为大多数机器学习模型都是模式特定的,这使得在另一个工作负载上建立学习模型不适用,但对模式不可知模型的实验研究很少。在这里,我们提供了将实例优化模型直接传输到另一个工作负载的直观视图。具体来说,我们在源工作负载上训练一个模型,然后在另一个工作负载上测试它的性能,称为目标工作负载(源→目标)。

我们对JOB进行训练实验,并将模型迁移到TPC-H (JOB→TPC-H)。我们在TPC-H上训练了一个模型,并考察了它在JOB (TPC-H→JOB)上的性能。

我们在表3中显示了两个工作负载的节点和深度的计划树统计信息。

总体查询执行速度如表4所示。根据观察,引入JOB数据比在TPC-H“特设”设置上训练的模型具有更好的性能。我们可以得出结论,对于给定的工作负载,使用来自相同工作负载的训练数据可能无法获得令人满意的性能。因此,如何利用来自其他工作负载的数据是查询优化模型的一个新问题。

5.4 Unified Model Performance (RQ3)

本节主要关注使用JOB和TPC-H数据集训练的模型的性能。与前一节类似,我们考虑了四种场景:每个数据集的“adhoc-rand”、“adhoc-slow”、“repeat-rand”和“repeat-slow”。对于每种场景,将JOB和TPC-H的训练数据合并为新的训练集,并分别在JOB和TPC-H测试集上对模型进行评估。

总体结果如表5所示。就执行时间内的回归次数而言,我们在表6中列出了结果。observations:表6、图4。

模型性能总结:不同数据集中的不同数据分布对统一查询优化模型来说是一个挑战,但是COOOL模型能够缓解这个问题,从而比最先进的回归方法更好地学习统一模型,从而加快总体查询执行速度,减轻单个查询回归,并优化慢速查询。我们的实验显示了我们提出的模型的压倒性优势。对于单实例场景,COOOL-list在总查询执行速度方面达到最佳性能,而COOOL-pair在减少单个查询回归数量方面达到最佳性能。当使用多个数据集训练统一模型时,COOOL-list在“重复”设置中表现最好,而COOOL-pair在“临时”设置中表现最好,并且没有总体查询执行性能回归。就稳定性而言,COOOL-pair是三种模型中最好的。

5.5 Model Comparison and Analysis (RQ4)

我们进行了大量的实验,取得了可喜的结果。但目前尚不清楚排名策略如何影响模型训练。本节旨在深入了解为什么两个COOOL模型优于Bao,特别是在统一模型训练方面。

5.5.1 Model efficiency

我们比较了我们的方法和最先进的方法的空间和时间效率。

  • Space complexity

  • The number of training samples

  • Training time consumption

我们总结了“adhoc-slow”设置下收敛所需的平均训练时间,如表7所示。

结论:尽管COOOL-pair和COOOL-list的收敛时间比Bao要长,但它们的模型推理效率和参数数量与Bao相同。因此,我们可以得出结论,COOOL是一种实用的方法。

5.5.2 A representation learning perspective for plan tree embeddings

基于回归的方法通常根据归一化方法将模型输出域限制在一个区间内。相比之下,基于排序的方法不限制模型输出的绝对值,这可能有助于模型更好地学习计划表示。本节旨在从表示学习的角度提供一些关于为什么COOOL优于Bao的视角。

总体结果如图5所示。综上所述,plan tree embedding space的dimensional collapse是机器学习查询优化模型在保持统一模型以学习不同工作负载的挑战。COOOL的两个变体与Bao具有完全相同的模型,但在几乎所有场景和设置中始终优于Bao。我们从查询计划表示的角度分析了为什么COOOL方法优于Bao。它可以指导研究人员进一步提高ML模型在查询优化方面的性能。

相关工作

6.1 Machine Learning for Query Optimization

传统的基于成本的查询优化器旨在选择具有最小估计成本的候选计划,其中成本表示执行延迟或其他用户定义的资源消耗指标。传统的优化器已经研究了几十年[31],主要集中在人工制作和启发式方法来预测成本、估计基数和生成计划[10]。

因此,数据库社区试图应用机器学习(ML)技术来解决这些问题。例如,一些研究引入了强化学习(RL)和蒙特卡罗树搜索(MCTS)来优化连接顺序选择任务[16,24,34,45],一些研究使用神经网络来完成成本建模和基数估计[19,32,41,42]。这些工作表明,精心设计的ML模型可以提高这些组件在查询优化中的部分性能。然而,它们可能不会提高优化器的性能,因为它们都没有证明单个组件的性能改进实际上可以带来更好的查询计划[18]。

近年来,一些研究尝试建立端到端ML模型进行查询优化[23,25,40]。它们都使用TCNN来预测查询计划的成本/延迟,并利用深度强化学习框架来训练模型。尽管与之前用ML模型替换优化器的某些组件的工作相比,他们已经取得了改进,但对优化器的评估应该从多个维度来衡量[35],其中一些最受关注的部分是实用性、数据/模式不可知性、可解释性、性能、可扩展性等。Neo[25]从表中学习行向量嵌入,因此需要维护不同数据的行向量嵌入。由于依赖关系,Balsa[40]不能处理高级SQL特性(例如子查询),这限制了它的可扩展性。此外,Neo和Balsa的实用性不如Bao[23]。Bao介绍了一种新颖的端到端查询优化方法,它推荐每个查询提示而不是现有的优化器。SQL hints可以限制现有优化器的搜索空间,并且每组提示对应一个计划,这使得它在实际场景中非常实用。

6.2 Learning-To-Rank

学习排序(Learning-To-Rank, LTR)是一个活跃的研究课题[43],在信息检索[20]、元搜索引擎[7]、推荐系统[13]、偏好学习[46]等领域有着广泛的应用。搜索引擎或推荐系统通常需要对大量可变的项目(例如网页、电影)进行排名。

SQL hints推荐问题更像是偏好学习问题,其中需要为每个用户(在本例中为SQL query)排序相对较小且固定数量的items(在本例中为SQL hints)。Plackett-Luce模型[22,28]是偏好学习中最流行的模型之一,后来被用作信息检索中的listwise损失函数[20]和分类任务中的softmax函数[8]。它是一个listwise模型,但可以通过pairwise方法有效地学习[14,47],通过将完整排名分解为pairwise comparisons并最小化pairwise损失函数。与[14]和[47]类似,我们最大化了其相似性的marginal pairwise likelihood(边际两两似然)。

结论

在本文中,我们提出了预测查询计划的成本顺序的COOOL,通过LTR技术与DBMS合作,为查询优化推荐SQL hints。COOOL有pairwise方法和listwise方法,每一种方法都可以提高整体查询执行速度,特别是在慢查询和减轻单个查询回归的情况下。此外,我们可以通过提出的方法维护一个统一的模型来改进查询计划选择,并且我们从表示学习的角度阐明了为什么COOOL-list和COOOL-pair方法都优于Bao。

COOOL为在两个数据集上维护统一的端到端查询优化ML模型迈出了一步,详细的分析可以为大规模的预训练查询优化模型提供初步的基础。虽然COOOL方法很有前途,但它们不能估计推荐查询计划的成本,也不能定量地比较两个查询计划的成本。

在未来的工作中,我们计划研究对候选计划进行排序的评估指标,这些候选计划在查询优化的执行延迟上存在多个数量级的差异,这有助于引入最先进的LTR技术。LTR是近年来一个比较活跃的研究领域,因此在查询优化方面还有相当多的工作需要探索。此外,开发大规模的预训练查询优化模型,定量准确地比较不同查询计划的成本也是未来挑战的方向。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值