物化视图、强化学习和物化视图的生成

本文探讨了如何通过深度学习和整数线性规划解决数据库中物化视图选择的问题。作者提出一种神经网络模型评估查询收益,并将子查询选择转化为ILP,借助马尔可夫决策过程和强化学习模型提升效率。关键挑战包括评估视图效益和智能子查询挑选。
摘要由CSDN通过智能技术生成

摘要:

物化视图是减少冗余计算的重要方法,需要现在的方法需要DBA手动生成物化视图。

作者提出的方法,挑选一个有用的子查询来生成物化视图。

但是有两个挑战

(1)怎么评估用一个物化视图来进行一个查询的收益。

(2)怎么挑选合适的子查询来生成物化视图。

(1)为了应对这个挑战,作者提出了一个基于神经网络的方法来评估使用物化视图回答查询的收益。在这个方面,作者从多个视角提取了重要的特征然后设计了有效的编码模型来将这些特征转换为隐藏表示。

(2)为了应对这个挑战,作者将挑选合适的子查询的问题建模为一个整数线性规划问题,他的目的是最大化效用通过选择一些合适的子查询来进行物化。设计了一个迭代的方式挑选一些子查询来进行物化。但是这种方式不能保证解的收敛性,所以为了解决这个问题,是作者将迭代的优化过程建模为一个马尔可夫的决策过程,然后用一个深度强化学习模型来解决这个问题。

从摘要中引出的问题

(1)什么是子查询?

(2)什么叫整数线性规划问题?

(3)马尔可夫决策过程是怎么回事?

(1)子查询?

一般来说对于一个查询可以嵌套另一个子查询,即:在一个SELECT查询内在嵌入另一个SELECT查询,外层的SELECT语句相较于外部查询内层的SELECT语句叫子查询,子查询可以进行多层的嵌套,但是每层都需要用()括起来,子查询可以用在SELECT语句中还可以用在INSERT、UPDATE、DELETE语句中,子查询是一个完整的SELECT语句,是其他SQL语句的一部分,大部分的子查询是在SELECT语句的WHERE子句中实现的,也可以放在FROM子句中当虚拟表。

例子:转自(35条消息) SQL——子查询_weixin_48052275的博客-CSDN博客_sql子查询

有两个数据表:

(1)departments表:

(2)employees表:

1.单行子查询:指子查询单行单列的数据,即只返回一个值,也可以称为单值子查询。可以使用运算符=,>,<,<=,>=,<>,经常在SELECT、UPDATE、DELETE语句的Where子句中充当条件。

例如1:查询在销售部工作的员工信息:

SELECT *
FROM employees
WHERE deptno=(SELECT dno FROM deptments WHERE dname="销售部");

结果如下:

 例如2:查询工资低于平均工资的雇员的信息:

SELECT *
FROM employees
WHERE esal<(SELECT AVG(esal) FROM employees);

结果如下:

2.多行子查询

指子查询返回单列多行查询,即一组数据。当子查询是单列多行子查询的时候,必须使用多行比较运算符,包括IN,NOT IN,ANY,ALL,SOME。IN和NOT IN可以独立使用,但是ANY和ALL必须与单行运算符组合起来使用。

<ANY:表示小于任何一个,即小于最大值。

=ANY:表示等于任何一个,与IN相似。

>ANY:表示大于任何一个,即大于最小值即可。

<ANY:表示小于所有的值,即小于最大值。

>ANY:表示大于所有的值,即大于最大值。

3.多列子查询

多列子查询获得的是多列任意行数据,当多列子查询返回单行数据的时候相当于单行子擦汗寻使用单行运算符(>,<,=等),返回多行数据的时候,在WHERE子句必须使用多行比较符(IN,NOT IN,ALL,ANY等)。

例如:利用emp表查询编号为和(7369的雇员的部门和工作岗位)完全相同的所有雇员。

SELECT ename,job,sal,deptno
FROM emp
WHERE (dept,job) = (SELECT deptno,job, FROM emo WHERE empno=7369);

使用子查询比较多列的时候,既可以使用成对比较也可以使用非成对比较。成对比较要求多个列的数据必须同时匹配,而非成对比较则不要求多个列的数据同时匹配,此时是单独写查询条件,哥哥条件之间必须是独立的。

例如上面的例子变为非成对比较的

SELECT ename,job,sal,deptno
FROM emp
WHERE dept IN(SELECT deptno FROM emo WHERE empno=7369)
AND job IN(SELECT job FROM emo WHERE empno=7369);

4.相关子查询

内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。

执行的过程:

        (1)从外部查询中取出一个元组,将元组的相关列的值传给内层查询。

      (2)执行内层查询,得到子查询操作的值。

      (3)外查询根据子查询返回的结果或者结果集得到满足的条件的行。

      (4)然后外层查询寻取下一个元组重复上述步骤,直到外层的元组全部处理完毕。

实例1:查询所有的部门人数

语句1:连接查询

SELECT dno,dname,COUNT(eno)
FROM employees RIGHT JOIN deptments ON employees.deptno = deptments.dno
GROUP BY deptno;

实例2:相关子查询

SELECT dno,dname,(SELECT COUNT(eno) FROM employees WHERE deptno=dno) AS 总人数
FROM deptments

也就是说内部的deptno依赖于外部的dno,即外部查询的dno传入给内部的deptno。

查询各部门的部门号,部门名和平均工资。

语句1:使用连接查询

SELECT dno,dname,MAX(esal),AVG(esal)
FROM employees RIGHT JOIN deptments ON employees.deptno=deptment.dno
GROUP BY dno;

语句2:使用相关查询

SELECT dno,dname,
    (SELECT MAX(esal) FROM employees WHERE deptno=dno),
    (SELECT AVG(esal) FROM employees WHERE deptno=dno)
FROM deptments
GROUP BY dno;

带exists的相关子查询:

EXISTS用于测试子查询的结果是否为空,如果子查询的结果不为空,则EXISTS发挥TRUE,否则返回FALSE。

SELECT *
FROM employees
WHERE EXISTS(SELECT * FROM deptments WHRER dno=deptno);

(2)整数线性规划问题:

(3)马尔可夫决策过程(使用深度强化学习解决)

Introduction

物化视图的来回答查询的两个挑战。

(1)用一个物化视图来回答一个查询的收益难以评估。

因为重写查询来对于所有不同的视图,以及执行所有不同的重写查询来获得事实的成本是不现实的。对于这一点,设计了一个成本估计模型用强化学习。

现有强化学习模型的缺点:评估单一的查询的成本而不是评估经过视图进行重写的查询的成本。(没懂?)

为了解决这个问题,作者首先提取了两种信息的重要特征。

(1)查询/视图的计划

(2)查询/视图的相关的表

将这些特征分为数值特征和非数值特征。

此外设计了不同的编码模型来transform不同的特征变为隐藏表示。

例如,使用序列编码模型将query/view计划编码为一个序列。然后,为了抓住成本和其他特征的线性和非线性关系,我们设计了一个有效的成本估算模型,它包括两个部分

        (1)a linear wide part

        (2)a non-linear deep part

(2)很难自动的选择一组高质量的子查询来进行物化,基于他们的benefits。

为了解决这个问题,我们将子查询的选择问题建模为一个整数规划问题。为了避免计算实际最优解的巨大的开销,我们提出了一个迭代的优化方式来得到近似的最优解。作者迭代的计算选择一个子查询进行物化的可能性,然而不同的迭代没有记忆能力也不能共享优化过程的反馈,这会导致优化结果重复震荡,这也会导致这种方法不能得到一个收敛到一个稳定的结果。为了解决这个问题,BigSub禁止将选择的子查询变为未选中的子查询在经过某个阈值的迭代数量之后。然而BigSub会变成一个贪婪的方法然后因此导致不好的结果。为了处理这个问题,我们提出了一个强化学习模型,这回将优化的过程变为一个马尔可夫的决策过程然后运用深度学习模型DQN来得到一个稳定的结果。

In summary,we make the following contributions.

(1)我们正式的定义了一个问题,这个问题就是自动选择子查询来进行物化得到物化视图,从而可以进行shring computatuins。与此同时,我们提出了一个端到端的基于学习的系统来解决这个问题。

(2)我们从不同的角度进行有用特征的提取来评估用视图来回答查询的benefit。以及我们使用不同的编码模型来讲不同的特征进行编码进隐藏层。我们提出了一个神经网络模型来进行cost estimation with views。

(3)我们将子查询的选择问题定义为一个ILP问题也就是整数线性规划问题,然后设计了一个强化学习的方法RLView来获得一个收敛的解。

Preliminaries

什么叫子查询:

一个SQL的查询可以被解析为一个语法树,像图2表示的那样,我们叫每一个子树为一个子查询。在这个例子中,我们提取了三个子查询,每一个子查询都会被transform为一个逻辑计划,然后每一个子查询都对应于一个子逻辑计划。为了简单起见,我们在本文的剩余部分交替的使用逻辑计划都和查询。(这两个词语)

 什么是成本:

对于一个查询或者一个子查询来说,我们考虑它的计算成本,这个计算成本是用来回答查询和子查询的成本的。例如一个CPU使用率和内存使用率以及通过一些量化规则来进行统一量化。

物化视图:(相当于实体的视图)

拿空间换时间,视图(关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作)。如果查询工作负载中的多个查询共享一个子查询,我们可以具体化该子查询的视图。为了子查询进行物化视图的overhead包括空间开销和计算开销(for this subquery)。因此,我们需要定义空间和总体的开销。

存储一个字节的大小byte是a,物化视图的大小是v。那么总的存储就是a*v。

总的开销就是=(字节的开销也就是a * v) + (cost也就是CPU和内存的开销)。

收益就是 = 使用物化视图的成本 - 不使用物化视图的成本

Overlapping Subqueries:

为了充分的利用一个视图来回答q,我们希望找到一个最大的视图的子集,这个子集有着最大的收益而且没有重叠的子查询。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值