一、简介
论文题目:Query-based Workload Forecasting for Self-Driving Database Management Systems
发表在2018SIGMOD,来自cmu的数据库组(这个组真的很厉害)
这篇论文主要讲数据库workload预测的问题。因为要实现数据库self-driving(如选择合适的时机在合适的列上自动创建索引),应该根据将要到来的查询对数据库进行优化,而不是根据过去一段时间的查询状态来优化。所以预测将来一段时间的workload十分重要。
二、主要内容
工作流程:
核心流程包括三部分,预处理、聚类和预测。
(一)预处理
1、首先,将原始sql语句抽象成模板,即把sql中的值替换为占位符号,具体替换的位置是:
(1)The values in WHERE clause predicates.
(2)The SET fields in UPDATE statements.
(3)The VALUES fields in INSERT statements. For batched INSERTs, QB5000 also tracks the number of tuples.
对以上结果再做额外处理,如空格、括号等。处理完后,形成一个通用的查询模板。
2、统计一个时间间隔内的各个模板对应的sql个数,然后把小的间隔合并成大的间隔,以节省空间。(还会保留一部分的原始sql,用于之后的优化评估。保留哪些语句采用的是reservoir sampling的方法)
3、继续合并:将语义相同的模板合并成在一起。本文使用启发式的方法近似的比较语义相同:访问相同的表,使用相同的谓语,返回相同的映射(该方法在获得比较好性能的同时还不丢失准确性)。
下面表是预处理完后,模板的个数:
语句数目减少最大的一步,但是依然还是很多,所以需要继续减少数量。
(二)聚类
1、聚类特征
有三类特征可以从模板中提取出来用于聚类分析:(1) physical, (2) logical, and (3) arrival rate history.
其中,前两个是别人使用的方法,本文使用第三种方法。
(1)physical:主要是资源消耗和DBMS执行查询时的各种运行指标。这种方法优点:可以为单个查询提供细粒度和准确的信息。缺点:与参数、硬件和其他 查询有关,只要有一个发生改变,那么之前收集的数据无效,需重建模型。
(2)logical:query的解析树、执行计划、query中用到的column等。优点:不依赖于数据库参数配置和workload特点。缺点:从logical feature获取到的信息有限,所以聚类可能不是很准确。
(3)arrival rate history:历史到达率。如:现在有过去24小时的记录,以每一小时为间隔统计每个模板的到达率,那么每个模板都会有连续的24个到达率,把它作为这个模板的特征向量,共24维。
聚类是要把有相同到达率模式的模板聚在一起形成一个簇,这个簇的到达率是簇内所有模板到达率的算术平均,在之后进行预测时只使用聚类中心,不再使用原始模板,这样可以大大降低计算量。如下图所示:
其中,在聚类时使用的距离度量方式是cosine similarity(余弦相似度,取值在[-1, 1]之间,绝对值越大相关性越强),而不是欧式距离这类度量方式。(使用预先相似度可以更好的反应趋势吧,而不仅仅是大小关系)
2、聚类方法
本文使用的是DBSCAN聚类方法(该方法可以参考这里:传送门),不是原始的DBSCAN,而是根据当前需求做了下修改:原始DBSCAN在对一个点划分到某个簇的时候会计算当前点到簇中任意一个核心的距离并取其中最小的距离,但本文在划分时是基于当前点到聚类中心的距离。(作者也试过k-means聚类,但是当workload有很多小的簇,或者每个簇有不同的大小、密度时,会出现问题)
使用一个阈值ρ (0 ≤ ρ ≤ 1)来判断是否属于同一类,只有大于阈值时才是同一个类。
具体步骤:
(1)从还未划分的模板中拿出一个,跟已有簇的聚类中心计算相似度,如果大于阈值,则划分到该类中;然后用算术平均更新聚类中心;如果和所有的聚类中心的相似度都小于阈值,那么新建一个聚类。
(2)聚类中心发生改变后(加入、删除类中的模板会使聚类中心变化,新的到达率也会使其改变),检查簇中的所有点是否还满足阈值条件,如果不满足则去掉该模板,将这个模板用(1)中的方法重新归类。
(3)合并聚类中心:如果两个簇的聚类中心的相似度大于阈值,则合并这两个簇。
参考图如下:
除了周期性的执行以上3步,系统还会检测新的workload,如果未见过的模板超过一定数量,则会触发以上3步来适应workload变化。
3、聚类剪枝
虽然聚类后数目大量减少,但还存在一些小的类,它们包含的查询只占很少的比例,只会增加模型的噪声。在实际试验中只使用了最大的5个簇来建模,其中这5个簇包含了95%的查询。
(三)预测
1、模型
这部分是根据历史到达率,预测将来一段时间的查询到达率。文中对6种模型做了比较:
(上面的LR指的是Linear Regression)
从3个方面进行了比较:
Linear:输入输出之间是否有线性关系。
Memory:模型是否能够综合输入与它从历史数据中保存下的信息来预测未来。
Kernel:是否使用核函数,使用核函数即支持非线性分析。
通常,线性模型能够有效的避免过拟合,并且对计算资源和训练数据要求较低,在预测较近的未来时间时表现较好。具有记忆性的模型可以挖掘数据的动态行为信息,但是增加了训练的复杂性与模型对数据的依赖。
本文采用ENSEMBLE方法,将多个模型进行合并做平均预测。
(1)使用线性模型预测近期,使用LSTM预测较长时间的结果。结合方式(ENSEMBLE)是将LR和LSTM的结果取平均。
(2)ENSEMBLE无法预测尖刺现象,如每一年只出现一次的峰值。使用KR核回归的方式可以预测这种现象。
将以上两种方式混合(HYBRID):当KR预测结果超过ENSEMBE一定倍数时(即预测到了尖刺),使用KR的结果,否则使用EMSEMBLE的结果。
2、Horizons和Intervals
Horizons:是模型能够预测多远
Intervals:模型预测多长时间间隔内的查询。如预测一分钟或一个小时内的查询数目。
三、实验
数据集,三个:
Admissions : An admissions website for a university’s graduate program. Students submit their application materials to programs in different departments. Faculties review the applications after the deadline and give their decisions.
BusTracker : A mobile phone application for live-tracking of the public transit bus system. It ingests bus location information at regular intervals from the transit system, and then helps users find nearby bus stops and get route information.
MOOC : A web application that offers on-line courses to people who want to learn or teach [3]. Instructors can upload their course materials, and students can check out the course content and submit their course assignments.
数据特点:
(一)聚类分析
1、聚类个数的选择
计算每个聚类查询总量占总查询总量的比例,发现最大的5个聚类查询比例占总数的95%以上,如下图所示:
2、top 5聚类的变化频率
比较相邻两天观察top5聚类是否发生变化,以及有几个聚类变了,如下图所示:
对于Admissions和BusTracker,90%以上的天数是只有小于等于1个模板发生变化。相比之下,MOOC有更多的模板发生变化,因为随业务更新会不断有新的查询出现。
(二)模型预测
1、不同模型对比
使用过去三周的查询到达率作为训练数据,预测长度是1小时。
评估:MSE
使用了6种单模型:LR, KR, ARMA, FNN, RNN, PSRNN,外加集成模型(LR+RNN),混合模型(LR+RNN+KR),实验对比图如下:
结果对比:
(1)短期预测,LR效果更好一些。因为短期内的到达率和过去最近的到达率线性关系比较强,所以线性模型足够了,复杂的模型反而会过拟合。而长期预测,像RNN这样的复杂模型效果更好一点,当预测时间大于等于1天时,RNN要比LR效果好。
(2)ARMA很不稳定,有10%的结果取得最好表现,但也有38%的结果取得最差表现。原因是它对超参数比较敏感,而超参数的设置和数据集相关。
(3)一般情况下,FNN比RNN要差。因为FNN无法像RNN那样利用历史状态,也不没法保证像LR那样不过拟合。
(4)KR有19%的结果表现最好,但也有24%的结果表现最差。它对从未见过的输入表现较差。
(5)PSRNN表现比RNN差,该模型试图对初始化做优化,并从该优化的基础上提升效果,但是在训练集受限的场景下,该模型的效果不稳定,并且计算时间较长。
(6)集成模型有61%的结果表现最好,并且没有表现最差的结果,集成模型方差较低,更稳定。
2、HYBRID预测BusTracker
分别对1小时和1周进行预测,结果如下图:
可以看出,对1小时的预测更准一些。
3、对尖刺的预测
使用Admissions数据集,将训练数据到达率间隔设为1小时,预测2017-11-15到2017-12-31的到达率,结果如下图所示:
只有KR能够预测尖刺现象。
4、不同粒度的预测评估
细粒度可以预测的更准,但是模型训练时间增长。
(三)与自动索引选择结合测性能
文中没有介绍自动索引具体算法,但是这个算法会基于查询到达率选择在某些列上创建索引。
在两个数据集上做了实验,Admissions(MySQL)和BusTracker(PostgreSQL)。
保留原workload的主键和外键,删除所有二级索引。
比较三种方法:
1、AUTO:使用本文方法基于实时预测的到达率创建索引,一共进行了16个创建周期,创建了20个索引。
2、STATIC:基于全部查询历史,使用自动索引算法在开始时创建20个索引。
3、AUTO-LOGICAL:也是基于实时预测创建索引,不同之处在于特征不是使用到达率,而是使用逻辑特征(见聚类部分)
结果如图所示:
在刚开始的时候,AUTO方法比STATIC方法要差,因为刚开始时没有二级索引。到最后阶段,AUTO方法在吞吐量上提升28%,延迟上收益23%
AUTO-LOGICAL方法与AUTO相比也要差一些,文中提到两个原因:The first is that the SQL queries are insufficient for determining whether two templates will have similar impacts on the system. The second reason is that templates within the same logical feature cluster may have multiple arrival rate patterns (including anomalies like one-time queries); this makes it more difficult for the Forecaster to identify these patterns and predict the trends according to the cluster centers.
---------------------------------------
只看论文感觉有些细节还是不清晰,所以还是需要看下代码的,源码地址:https://github.com/malin1993ml/QueryBot5000