这个是学姐和我一起整理的索引推荐的学习记录,已发布在公众号上,在这里做一个记录吧。
https://mp.weixin.qq.com/s/cE6L571OlzOctnBywuYJew
1. 摘要
索引推荐是数据库管理系统中一个非常重要的现实问题。尤其是在大规模数据的存取上,建立索引可以大幅度减少磁盘扫描的次数,提高负载执行效率。从理论上来说,索引推荐问题是一个NP-hard问题,是指输入数据集、工作负载、存储结果,输出最佳的索引组合。可以预见,各个表中字段的组合可能呈爆炸式增长,在大规模问题上是不可能得到最优解的。目前的索引推荐研究通常都是用各种折中的办法,得到一个相对优的解。本文从两个方面来阐述一下现有工作:其一是具有可解释性的传统组合优化方法;其二是最近流行的基于机器学习模型的方法。最后,我们将探讨一些这些方法的适用场景,给出一些使用建议和未来展望。
2. 索引推荐基础
这一小节,我们将介绍一些索引推荐问题的基础知识,包括索引推荐的影响条件的目标参数等。给定一个关系R、负载集合W、存储空间上限B,索引推荐就是要寻找不超过空间上限B,使得W在R上执行效率最高的索引集合。我们可以发现在该问题中两个重要的性能指标:一个就是负载执行的时间效率;另一个则是索引建立占用的空间存储开销。我们希望得到的索引集合能够使得时间效率提高,而占用的空间尽可能少。此外,我们还需要考虑一些次要指标,比如索引推荐算法的运行时间、索引的建立时间等等。下面我们将讲述一些经典的索引推荐算法来展示研究者们如何有效解决这一NP-hard问题。
3. 索引推荐分类
本文首先根据索引推荐算法是否具有可解释性将现有方法分为两个大类(如表一所示):基于组合优化和基于机器学习的。
表一 索引推荐算法的分类
其中基于组合优化的方法通常分为两个步骤,第一个是预剪枝,生成候选的索引集合,然后再根据目标函数进行迭代,直到找到最优集合。基于机器学习的方法通常将索引的状态和动作编码成向量,然后生成训练集去训练模型。基于机器学习的方法效率通常不太稳定,结果不具有可解释性,并且训练数据也比较难获取。如表一所示,本文将根据目标代价将传统组合优化方法分为以时间效率为目标的,和以时间效率/空间开销为目标两小类。
4. 面向Time cost的索引推荐
本小节介绍三个典型的面向时间代价的传统组合优化索引推荐方法。
Chaudhuri和 Narasayya提出了基于Microsoft SQL Server的 AutoAdmin索引选择算法[1],如图一所示。
图一 AutoAdmin
该迭代算法通过在每次迭代中增加索引宽度来识别多列索引。迭代包括两个步骤:首先,根据每个查询j查询确定候选索引Sj ,所有S的并集用于第二步的输入;第二步确定最佳索引配置,该算法是对具有m个元素的候选索引的所有子集的完整枚举和用于查找 n > m个索引的贪婪扩展的组合。如果 m = n,则枚举会评估具有n个元素的所有索引子集以确保最佳解决方案。组合的数量可能非常大,无法在合理的时间内进行评估。如果 m = 0,则使用纯贪婪方法来减少运行时间。
DTA[2]是AutoAdmin算法的完善版本。首先根据贪婪枚举确定每个查询的候选索引再为整个workload确定索引配置的方法是相同的。该方法主要从如下方面进行了扩展:1.一开始就考虑了多列索引而不是迭代增加 2.候选索引确定后 将候选索引与当前索引集合并 3.通过标识种子配置考虑索引交互,减少枚举次数 4. 加入调整时间限制,可以加快算法的执行速度。DTA作为改进后的算法,在各个方面都有了很大提升。比如加入了时间限制,算法可以随时中断,其运行时间可与其他方法相提并论。
Dexter[3]算法以假设索引为基础,是面向PostgreSQL建立的一种索引推荐算法。该算法分为两个阶段:第一阶段:1.算法首先根据查询及运行时的信息,拥有相同模板的查询被分到同组;第二阶段 1.使用explain命令确定所收集查询的初始成本 2.为未建立索引的所有潜在单列和多列索引(最大为2)创建假设索引 3.从查询优化器中检索成本估算和查询计划 4. 选择相较于步骤一提升最大的候选索引对象。可以看到由于一开始就从查询本身出发,Dexter的时间开销比较稳定。但是该方法并未考虑到索引的删除方案,可能会产生空间开销比较大的结果集。
5. 面向时间/空间的索引推荐
本小节介绍四个典型的考虑到空间开销的传统组合优化索引推荐方法。
Valentin et al. 提出 DB2 Advisor[4]来确定 IBM DB2的有益索引。DB2Advis 利用优化器的假设功能来实现索引推荐,其主要包括如下三个步骤:(1)将所有的潜在索引都设置为假设索引 (2)向优化器询问查询的最佳查询计划,将查询计划用到的假设索引加入候选索引I中(3)将I中的所有索引按照空间收益率排序,按照排列顺序将索引添加到最终配置中,直到达到存储预算。该方法适用于高预算,可以在短时间内为每个查询建立最佳的索引。但是由于该方法面向单个查询进行优化,可能会遗留掉对于单个查询来说糟糕,但是对整体查询较好的索引。
Bruno et al.[5] 提出了relax方法,在候选集合上循环使用转换规则以减少时间/空间占比。该方法首先利用查询优化器为获取每个查询可能的最佳索引。然后在得到的workload上的最佳索引候选集上不断进行如下的relax过程,以降低存储开销的同时保持尽可能高的时间收益。转换规则如下:(1)将两个索引合并为一个(2)拆分两个索引,即创建有共享属性的索引和最多两个具有剩余属性的索引(3)删除索引末尾属性保留前缀(4)将索引转化为聚集索引(5)删除索引。由于该方法的效率主要取决于执行转换规则的次数,所以相较于其他方法其需要运行更长的时间才能得到最优解。
Dash et al. [6]提出了Cophy算法,将索引推荐问题转换为了一个线性规划问题。CoPhy将所有的候选单列和多列索引都枚举出来,然后将每种索引子集下的代价都测量出来。而后将是否建立索引表示成一个二进制整数变量,并且将空间开销建模成线性规划问题的前提条件。最后使用传统方法得到上述线性规划问题的解,同时也就得到了最佳的索引推荐集合。由于使用了线性规划模型,Cophy方法可以在任意空间预算下都得到最优解。但是其在枚举和代价估计的时候花费了很多时间资源,以至于该方法并不能扩展到大型问题上去。
Schlosser et al.[7]提出了迭代选择方法来进行索引推荐,该方法专注于迭代过程的剪枝,不限制候选索引集。该方法的核心思想如下:以贪婪的迭代方式工作,根据时间/空间比率计算收益,每步添加或扩展一个使得收益最高的索引。该算法从一个空的解集S =∅开始。而后通常有两种选择:根据时间/空间收益,选择将一个新的单属性索引添加到S,或者通过附加属性 i ∈ {1, …, N} 扩展现有索引 w ∈ S。该方法并不进行预剪枝,能够以更高的概率获得最优解。
6. 基于机器学习的索引推荐
本小节介绍三个典型的基于机器学习的自动化索引推荐算法。
Sharma et al. [8] 提出了基于强化学习的索引推荐算法(RL)。RL方法将索引推荐过程转换为一个马尔可夫过程。其中工作负载被编码成一个n*m的矩阵,每个位置表示查询i在第j列上的基数。索引状态被编码成一个m维度的矩阵,第j维用来标识第j列是否被索引。可选动作集合为将索引矩阵m中某列进行反转(由0变1或由1变0)。索引推荐的reward由无索引代价/当前索引状态代价来衡量。如果当前性能提升较大,当前索引状态下负载的执行代价减小,reward升高。该方法是一个非常简略的单列索引推荐算法,在回报值和动作编码上都不是十分完善,是研究者们将机器学习技术用于索引推荐的第一次尝试。
Sadri et al.[9] 使用了深度强化学习DRLindex实现了云数据库上的在线索引推荐。相较于RL,DRLindex方法在大体思路上是不变的,都是将索引状态、负载状态编码起来,设计对应的reward进行学习。但是该方法完善了编码系统、动作空间以及回报值设计等等。并且DRLindex是建立在分布式数据库上的,其状态编码更多地考虑到了分布式节点情况下的代价。同时由于该方法考虑到了在线场景,其对索引变化的响应速度也是很快的。
Lan et al.[10]提出了基于深度强化学习的离线索引推荐算法DRL。该方法不在以是否建立某一列索引为粒度,该模仿传统方法中候选集剪枝的方法。DRL分为两个大的步骤,其一是根据根据查询优化器生成面向每个查询生成候选索引集合;其二是在工作负载候选索引集合的基础上,建立强化学习模型,进行候选索引的剪枝和选择。相较于一般基于RL的算法,该算法能够适用于更多的场景,并且提前预剪枝的方法为强化学习减少了状态空间。但是该方法的致命缺陷是强化学习所需要的训练时间过长,需要很久才能试错结束,得到一个解。
7. 总结
本文简单介绍了索引推荐算法近些年来的研究,主要分为基于组合优化方法的研究和基于机器学习算法的研究。可以发现尽管机器学习赋能数据的方法已经取得了一定的成就,但是其面临的问题和挑战依然非常多,并不能够用于现实的生产实践中去,组合优化方法仍然是主流的研究方向。在组合优化方法的使用上,我们有如下建议:(1)如果需要快速得到解决方案,并且空间预算充足,并且索引的宽度受限 ,建议使用AutoAdmin 尤其是DB2Advis;(2)如果在时间预算比较充足,可以使用relaxation;(3)对于可以全面列举相关候选组合的小规模问题,Cophy的LP比较适用,其保证对任何预算都可以达到最佳;(4)DTA是一种比较通用的方法,在多种情况下都可以在一定运行时间内给出较为可靠的索引推荐结果。在基于机器学习的方法上,我们有如下使用建议:(1)数据集的规模不易过大,要考虑到大量训练集获取的可行性;(2)在环境产生变化时,旧模型可能是不适配的,需要重新训练。总而言之,目前没有在任何场景下都适用的索引推荐算法,索引推荐作为一个数据库管理系统中的基础问题,仍然是人们需要解决的重点难题之一。在数据库日趋复杂的今天,数据库索引推荐的高效自动化是未来重要的研究方向之一。
参考资料
[1] S. Chaudhuri and V. Narasayya. Anytime Algorithm of Database Tuning Advisor for Microsoft SQL Server. https://www.microsoft.com/en-us/research/ publication/anytime-algorithm-of-database tuning-advisor-for-microsoft-sql-server, visited 2020-06-04, June 2020.
[2] S. Chaudhuri and V. R. Narasayya. An efficient cost-driven index selection tool for microsoft SQL server. In Proceedings of the International Conference on Very Large Databases (VLDB), pages 146–155, 1997.
[3] A. Kane. Dexter - The automatic indexer for Postgres, June 2017. https://github.com/ankane/dexter, visited 2020-06-04.
[4] G. Valentin, M. Zuliani, D. C. Zilio, G. M. Lohman, and A. Skelley. DB2 advisor: An optimizer smart enough to recommend its own indexes. In Proceedings of the International Conference on Data Engineering (ICDE), pages 101–110, 2000.
[5] N. Bruno and S. Chaudhuri. Automatic physical database tuning: A relaxation-based approach. In Proceedings of the International Conference on Management of Data (SIGMOD), pages 227–238, 2005.
[6] D. Dash, N. Polyzotis, and A. Ailamaki. Cophy: A scalable, portable, and interactive index advisor for large workloads. PVLDB, 4(6):362–372, 2011.
[7] R. Schlosser, J. Kossmann, and M. Boissier. Efficient scalable multi-attribute index selection using recursive strategies. In Proceedings of the International Conference on Data Engineering (ICDE), pages 1238–1249, 2019.
[8] A. Sharma, F. M. Schuhknecht, and J. Dittrich. The case for automatic database administration using deep reinforcement learning. CoRR, abs/1801.05643, 2018.
[9] Z. Sadri, L. Gruenwald, and E. Leal. Online index selection using deep reinforcement learning for a cluster database. In Proceedings of the International Conference on Data Engineering Workshops (ICDEW), pages 158–161, 2020.
[10] Hai Lan, Zhifeng Bao, and Yuwei Peng. An Index Advisor Using Deep Reinforcement Learning. CIKM 2020.