Join Query Optimization with Deep Reinforcement Learning Algorithms

目录

  • 1.动机
  • 2.贡献
    • 2.1总体概况
    • 2.2具体点
  • 3.背景
    • 3.1查询优化领域文献
    • 3.2查询优化为什么是一个仍未解决的问题
    • 3.3查询优化中主要未解决问题
    • 3.4应用于查询优化的强化学习概念的调整
    • 3.5RL算法——Q-learning
    • 3.6RL算法——Policy Gradient Methods
  • 4.FOOP架构
  • 5.实验
    • 5.1配置
    • 5.2算法比较
    • 5.3增强RL算法
    • 5.4与其他算法对比实验
  • 6.结论
  • 7.展望

1.动机

 查询优化已经进行几十年的研究了,而连接顺序选择又是查询优化中的一个非常重要的问题。连接顺序选择是一个NP-hard问题,随着连接关系数量的线性增加,而连接顺序呈现指数级增长。(1)传统数据库采用动态规划的方法,再加上一些限定规则进行修剪搜索空间,避免穷举所有可能的连接顺序,但是也会消耗许多资源,而且这些限定规则往往是基于专家经验,需要手工设计和频繁维护。同时也降低了在更大的搜索空间找到更好的计划的可能。(2)传统数据库采用的成本模型,基于传统的基数估计,而基数估计中,属性往往是采取独立性假设,但是真实世界的数据库,各个属性并不是完全独立,相反,还具有高度的相关性,所以,这样会导致,成本模型估算不准确。最终导致次优的执行计划。(3)传统的数据库优化器不会从过去执行过的糟糕计划中学习教训,吸取经验,从而下次执行依然不能避免糟糕的计划,虽然早在多年前Leo就提出了学习型优化器,不过这些方法并没有广泛采用。

2.贡献

2.1总体概况

 最近,提出了将机器学习引入数据库领域,取得了不错的进展,可替代传统的查询优化器组件。于是,基于Rejoin、DQ提供的思想,本文提出了一种通用的连接顺序优化器架构FOOP,可以结合不同的深度强化学习算法进行直接对比。FOOP主要可以观察查询优化过程中所有关系和中间执行计划。

2.2具体点

(1)FOOP将连接顺序选择问题表达为可观察的强化学习过程,而且将FOOP独立于数据库系统,处于应用层,直接跟踪所有关系和中间执行计划。
(2)由FOOP框架,首次直接比较,各种DRL算法在查询优化中的性能。
(3)FOOP使用时间复杂度较低的优化算法生成的查询计划与传统优化器生成的查询计划,在成本模型中估计值相当。

3.背景

3.1查询优化领域文献

  1. 查询优化仍未解决
    (1)Is query optimization a solved problem

  2. 传统数据库优化方法
    (2)System R
    (3)Vulcano
    (4)Leo

  3. 引入新的查询基准
    (5)How good are query optimizers, really?

  4. 机器学习改进基数估计
    (6)Neural network-based approaches for predicting query response times.
    (7) Towards predicting query execution time for concurrent and dynamic database workloads.
    (8)Learning-based query performance modeling and prediction.
    (9)Predicting multiple metrics for queries: Better decisions enabled by machine learning.
    (10)Robust estimation of resource consumption for sql queries using statistical techniques.
    (11)Wisedb: a learning-based workload management advisor for cloud databases.

  5. 强化学习改进优化
    (12)Database meets deep learning: challenges and opportunities.
    (13)Towards a hands-free query optimizer through deep learning.(DQ扩展)
    (14)Learning state representations for query optimization with deep reinforcement learning.(状态如何表示)
    (15)Skinnerdb: regret-bounded query evaluation via reinforcement learning.
    (16)Neo: A learned query optimizer.(Neo)——借鉴(Mastering the
    game of go with deep neural networks and tree search.)
    (17)DQN应用于查询优化——借鉴(Playing atari with deep reinforcement learning. arXiv preprint)
    (18)Rejoin和DQ均依赖传统成本模型。DQ加入微调机制。DQN和PG比Neo的DNN训练时间更短。

3.2查询优化为什么是一个仍未解决的问题

  1. 查询优化目标:将SQL转换为高效的执行计划
  2. 连接顺序选择是查询优化重难点,连接顺序选择本质搜索最佳排序,最佳意味着成本估算达到最低。
  3. 一般来说,n个关系进行排序,时间复杂度为O(n!),
  4. 连接顺序还需要考虑到物理运算符,那么这个复杂度将会大大增加
  5. 对于n个关系,可以得到二叉查询树数量为(2*n-1)!/((n-1)!*n!),例如:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第1张图片
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第2张图片
  6. 以上仅仅是查询二叉树的形状数量,每一颗二叉树的结点还有不同的排列组合,这样一来复杂性很大。更不用说,诸如选择,投影之类的问题,再加上,复杂度极高。
  7. 一般来说,查询优化的连接顺序选择通常使用n!评估,但是n!的复杂性也高,即也是一个NP难问题。因此需要设计优化算法减小搜寻空间,动态规划加上一系列限定规则可以做到,但是,不能保证未搜索空间一定不存在最优计划,换句话说有可能找到的是次优计划,那么仍需要进行研究新算法,减少时间复杂度。
  8. 查询优化器的架构主体由执行计划器和成本估算模型组成。
  9. 计划器是主体模块,功能是列出并检查所有可能的查询计划,然后根据特定的成本模型选择最佳方案。其中的问题是列出所有可能的查询计划,搜索空间过大,时间复杂度太高,也是一个NP难问题。为了解决这个问题,通常是启发式方法。例如动态规划结合特定规则减少搜索空间、若查询过大,则再加上贪婪算法、遗传算法。然后,再为了降低复杂度,只用左深查询树。
  10. 成本模型含义是指关于数据库的不同假设和统计数据,进而评估查询计划的总体成本。成本模型主要包括CPU估计、I/O估计、基数估计。特别是,基数估计是在简单情况下,例如对于基表,使用分位数统计、频率分析、不同的计数规则进行预测。

3.3查询优化中主要未解决问题

  1. 查询计划的限制性问题
     原因:穷举耗时;解决:传统优化器只使用左深树;结果:降低时间复杂度至O(n!);不足:减少了搜索空间,降低找到最优方案的机会。深入:一般情况,左深接近最优,但对于复杂(大量连接关系)查询的分析型数据库,左深反而是次优。
  2. 查询优化的基准问题
     原因:评估查询优化器的基准的列值均匀分布且独立分布,而真实世界数据库列值相互关联且非均匀分布,因此,基于现有基准进行调整的查询优化器不能推广到真实世界,仅为部分优化;解决:采用源自真实世界的基准。
  3. 基数估计的错误问题
     原因:分位数统计无法检测相关列值,无法比较列值,进而作出统计。因此,在非均匀分布的列值会产生错误,进而导致成本模型估算错误。

3.4应用于查询优化的强化学习概念的调整

  1. 强化学习定义:学习做什么?环境——>行动,在这个过程中,将产生信号(积极或者消极);例子:婴儿与周围环境的互动,无人教导,产生因果信息,某一个动作导致某一个结果。
  2. 数学角度:这个过程抽象为函数;目标:试图得到最大化奖励,但不直接给出采取哪一个动作。
  3. 基础:贝尔曼最优原则、动态规划、马尔科夫决策过程
  4. 马尔科夫扩展思想:agent与环境互动,采取一系列行动,期待最终得到最大化奖励;关键点:未来状态取决于当前状态,与过去状态和动作无关;内容:如图1五元组;目标:策略S——>A(状态到动作的函数),该函数可以使最终奖励最大,工作原理如图2。
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第3张图片
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第4张图片

3.5RL算法——Q-learning

  1. Q-learning,来源:结合MC与DP,属于TD算法一种;内容:函数Q(s,a)指导在状态s时采取最优动作;特点:离线策略算法,简化算法分析、快速收敛,不过当前策略还是有作用,可以决定采取哪一个状态-动作;传统:Q表存储信息,不足之处是存储过大,计算复杂;改进:非线性函数近似Q函数,特别是神经网络;借鉴思想:Atari;例子:DQN;关键点:输入独立性,但在交互过程,数据并不独立;解决:引入经验回放。
  2. 经验回放,定义:收集观察数据的缓冲区
  3. 目标网络,定义:解决Q值计算与更新参数的关联较大,采用两个相同Q网络,当前网络仅选择动作,更新参数;目标网络仅计算Q值,不需要迭代更新,仅隔一段时间从当前网络复制参数即可;使得算法收敛快。
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第5张图片
  4. DDQN+PR:DDQN再进一步通过解耦目标Q值动作选择与Q值计算,避免低高估。PR通过改变样本被选中的概率,提出优先级,一般来说,样本的TD误差越大,优先级高,越容易收敛。

3.6RL算法——Policy Gradient Methods

随后补充介绍~

4.FOOP架构

  1. 查询优化建模为MDP;
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第6张图片
    在这里插入图片描述
  2. 查询、数据库信息、状态、动作——>特征向量
    在这里插入图片描述
    其中;代表未连接,()代表已经连接,[]代表某个状态
    在这里插入图片描述
    其中()代表动作,动作仅代表两个关系连接,这是巧妙设计,减小动作空间,不至于一开始就设计三个或者以上关系的连接。如下图例子:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第7张图片
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第8张图片

其中灰色代表无效动作,亮黄代表已选择动作,普黑代表候选动作。

  1. 奖励难点:实际查询时间难以获取,且代价昂贵;解决:采取传统数据库自带成本模型(借鉴How good are query optimizers, really?);内容:负成本,且不计算子计划成本,只获取最终成本。
    成本函数如下;Join Query Optimization with Deep Reinforcement Learning Algorithms_第9张图片
    其中R代表基本关系,Q代表子查询计划,r和l分别代表右侧和左侧,hj和ij代表散列连接和索引嵌套循环连接,| |代表基数估计函数,其他为参数。该模型不考虑I/O,简单,与PG相似。
    奖励函数如下:
    在这里插入图片描述
    标准化如下:
    成本模型估算范围(106,1018)~奖励范围(-10,10),再进行奖励范围剪裁。首先奖励为负,限定在(-10,0),其次若成本模型估算高于1013,奖励均为-10。如下图:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第10张图片
  2. 关键点:特征化足够准确,RL算法足够优

5.实验

5.1配置

  1. 使用PG的基数估计器、执行器
  2. 独立部署FOOP
  3. 基于TensorFlow和OpenAI_gym
  4. 查询集JOB、数据集IMDB
  5. 训练集80、测试集33

5.2算法比较

  1. DQN
    借鉴DQ进行设置,参数列表如下:Join Query Optimization with Deep Reinforcement Learning Algorithms_第11张图片
    关键点设置:预期奖励依赖成本模型,奖励只给予最终计划,奖励为负
  2. DDQN
    加入优先经验回放,参数列表如下:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第12张图片
  3. 实验结果对比如下:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第13张图片
    结论:降低高方差,避免昂贵计划。
  4. PPO
    随后介绍~

5.3增强RL算法

  1. 训练测试集划分来增强
    原有:随机划分
    改进:满足条件划分(1)所有关系均存在于训练集(2)所有连接条件均存在于训练集(3)测试集尽可能包含不同连接条件
  2. 实验对比结果如下:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第14张图片
    其中方差减小,更加稳定,减少过拟合。
  3. 训练多个策略来增强,原理:多个策略优化查询计划,再从多个已经优化的查询计划中进行选择成本估算相对最低的最优计划。
  4. 实验对比结果如下:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第15张图片

5.4与其他算法对比实验

  1. DQN系列与DP-left估算成本比较:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第16张图片
    这里成本模型由于是数据库自带,自然更好。
  2. PPO与DP-left估算成本比较:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第17张图片
  3. 蓝色点低于黄色异常分析:如图,因为对于某些离群查询,涉及到的关系,在训练时很少访问,而在测试时大量访问,导致测试集不能很好包含足够的训练样例,不能很好学习这些查询。
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第18张图片
  4. 真实查询时间比较:
    Join Query Optimization with Deep Reinforcement Learning Algorithms_第19张图片
    其中DRL算法的延迟优化与查询关系为线性关系,且为O(n)。而DP-left为O(n!)。

6.结论

  1. FOOP仅优化连接顺序选择。
  2. FOOP易扩展为select-project-jion
  3. PPO优于DQN系列
  4. 集成(多策略)学习提高优化性能
  5. FOOP生成查询计划的成本与PG相似,但延迟明显较低。

7.展望

  1. 问题:RL算法样本低效,需密集计算;解决:采取PG专家引导训练,快速收敛
  2. 问题:成本模型中基数估计可能出错;解决:微调,采用执行过的样本的基数数据
  3. 问题:实现端到端;解决:进行扩展,例如对选择、投影、聚合等操作进行优化设计
    本文是对《Join Query Optimization with Deep Reinforcement Learning Algorithms》进行阐述。

你可能感兴趣的:(数据库内核开发,数据库,算法,机器学习,人工智能,postgresql)