Spark SQL多表连接优化方法、装置、计算机设备和存储介质
技术领域
本申请涉及大数据
技术领域
,特别是涉及一种Spark SQL多表连接优化方法、装置、计算机设备和存储介质。背景技术
Spark SQL是Spark用于处理结构化数据的组件,是Spark中最常用的组件之一。Spark SQL的起源是为熟悉传统关系型数据库但不理解MapReduce方法的技术人员提供快速上手的工具,可以使用结构化数据查询语言的形式使用Spark集群处理大规模数据。其实现方式是通过catalyst查询优化器对输入的类SQL语句进行分析、优化,最终形成Spark底层程序执行。而Spark SQL查询优化与传统数据库一样,存在多表连接查询执行性能较低的问题。对于多表连接查询,多表之间不同的连接顺序和连接的物理实现都是影响执行时间的重要因素,需要优化器快速有效地选择最优执行计划。
目前Spark SQL解决多表连接查询计划选择问题的方法是基于代价的优化,通过设置代价模型来预先评估两表连接的代价,使用动态规划算法选择预估代价最小的连接顺序构建逻辑计划,并根据设定的阈值选择物理实现构建物理计划。但是,多表连接执行计划搜索空间随连接表的数量爆炸式增长,在查询中连接表数量较多时选择最优计划的时间过长,选择连接物理实现方法的阈值也依赖于开发人员的经验手动调整。伴随着大数据中一些复杂分析方法的发展,Spark SQL在多表连接查询中的问题越来越突出。近年来,在传统数据库领域出现了一些使用深度强化学习优化多表连接查询的方法。但是,这些方法只针对多表连接的顺序进行优化,在Spark SQL中,查询被转换为Spark RDD底层程序执行,连接操作在执行时不同的物理实现方法也是影响多表连接查询性能的重要因素。
因此,现有的Spark SQL查询优化器存在选择最优连接执行计划效率低和选择最优物理计划依赖开发人员的经验。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高最优连接执行计划效率的Spark SQL多表连接优化方法、装置、计算机设备和存储介质。
一种Spark SQL多表连接优化方法,所述方法包括:
获取根据目标数据仓库设计的SQL多表连接查询语句集;
将所述SQL多表连接查询语句集划分为训练集和测试集;
根据所述训练集和所述测试集,对预先构建的马尔可夫决策模型进行训练,获得所述目标数据仓库的多表连接查询计划选择策略;
根据所述多表连接查询计划选择策略,对所述目标数据仓库的数据表进行连接。
在其中一个实施例中,构建所述马尔可夫决策模型的方式为:
将Spark程序输入的SQL多表连接查询语句与数据仓库信息结合,以连接树的形式抽象为马尔可夫决策模型的状态特征;
将Spark SQL原有的逻辑计划选择和物理计划选择两个阶段结合,重新设计了计划选择方法,并抽象为马尔可夫决策模型的动作特征;
根据Spark SQL连接的物理实现,设计用于评估执行动作的时间代价的时间代价模型,作为马尔可夫决策模型的奖励;
根据所述状态特征、所述动作特征和所述奖励,构建所述马尔可夫决策模型。
在其中一个实施例中,所述将Spark程序输入的SQL多表连接查询语句与数据仓库信息结合,以连接树的形式抽象为马尔可夫决策模型的状态特征的步骤,包括:
将Spark程序输入的SQL多表连接查询语句与数据仓库信息结合,以各连接树的形式表示对应的数据表,所述连接树的特征以向量的形式表示为:
其中,前m位是以独热编码的形式表示的连接树中包含的连接键,最后一位Ca是连接树执行结果的预估基数,由数据仓库提供的基数估计器获取;
由各所述连接树组成的森林,表示为马尔可夫决策模型的状态特征。
在其中一个实施例中,所述将Spark SQL原有的逻辑计划选择和物理计划选择两个阶段结合,重新设计了计划选择方法,并抽象为马尔可夫决策模型的动作特征的步骤,包括:
从所述状态特征的森林中选取两个连接树L和R进行连接,并指定连接物理实现方法pa,表示为向量的形式[L,R,pa],作为马尔可夫决策模型的动作特征;
其中,L代表连接左表,R代表连接右表,pa代表连接物理实现方法。
在其中一个实施例中,所述连接物理实现方法包括:
广播小表后进行哈希连接、数据混洗后进行哈希连接和数据混洗后进行排序合并连接中的任意一种以上。
在其中一个实施例中,所述根据Spark SQL连接的物理实现,设计用于评估执行动作的时间代价的时间代价模型,作为马尔可夫决策模型的奖励的步骤,包括:
对于所述动作特征[L,R,pa],以所述连接树L和R的估计基数为输入,根据选用的所述连接物理实现方法pa选择代价模型,根据Spark集群计算节点的性能设置代价模型的参数,得到估算的动作时间代价,经过归一化后作为马尔可夫决策模型的奖励。
在其中一个实施例中,所述根据所述训练集和所述测试集,对预先构建的马尔可夫决策模型进行训练,获得所述目标数据仓库的多表连接查询计划选择策略的步骤,包括:
根据所述训练集和所述测试集,采用交叉检验训练的方式对预先构建的马尔可夫决策模型进行训练,获得所述目标数据仓库的多表连接查询计划选择策略。
一种Spark SQL多表连接优化装置,所述装置包括:
语句集获取模块,用于获取根据目标数据仓库设计的SQL多表连接查询语句集;
划分模块,用于将所述SQL多表连接查询语句集划分为训练集和测试集;
训练模块,用于根据所述训练集和所述测试集,对预先构建的马尔可夫决策模型进行训练,获得所述目标数据仓库的多表连接查询计划选择策略;
连接模块,用于根据所述多表连接查询计划选择策略,对所述目标数据仓库的数据表进行连接。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现所述方法的步骤。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述的方法的步骤。
上述Spark SQL多表连接优化方法、装置、计算机设备和存储介质,通过获取根据目标数据仓库设计的SQL多表连接查询语句集;将SQL多表连接查询语句集划分为训练集和测试集;根据训练集和测试集,对预先构建的马尔可夫决策模型进行训练,获得目标数据仓库的多表连接查询计划选择策略;该马尔可夫决策模型是使用深度强化学习算法求解,得到目标数据仓库的多表连接查询计划选择策略,根据多表连接查询计划选择策略,对目标数据仓库的数据表进行连接。解决了Spark SQL现有的查询优化在多表连接查询计划选择时效率低、依赖开发人员经验的问题,能够快速有效地构建多表连接查询执行计划,从而提高Spark SQL执行效率。
附图说明
图1为一个实施例中Spark SQL多表连接优化方法的流程示意图;
图2为一个实施例中多表连接SQL查询的连接树构建示例图;
图3为一个实施例中训练的方法各模块关系示意图;
图4为一个实施例中实验测试计划构建时间结果图;
图5为一个实施例中实验测试计划执行时间结果图;
图6为一个实施例中Spark SQL多表连接优化装置的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种Spark SQL多表连接优化方法,包括以下步骤:
步骤S220,获取根据目标数据仓库设计的SQL多表连接查询语句集。
其中,目标数据仓库是指需要进行数据表连接的数据库。
步骤S240,将SQL多表连接查询语句集划分为训练集和测试集。
步骤S260,根据训练集和测试集,对预先构建的马尔可夫决策模型进行训练,获得目标数据仓库的多表连接查询计划选择策略。
其中,马尔可夫决策模型用于Spark SQL多表连接查询计划选择,通过马尔可夫决策模型可将Spark SQL多表连接查询执行计划选择问题转换为马尔可夫决策过程,可以使用深度强化学习算法训练得到指导构建最优计划的策略,即目标数据仓库的多表连接查询计划选择策略。
具体地:Spark SQL查询应用于某个数据仓库时,将该数据仓库的SQL多表连接查询语句,根据数据仓库中数据表的信息和Spark SQL通过直方图获取的数据表基数信息,抽象为初始状态,使用矩阵的形式表示,针对该数据仓库,根据预先构建的马尔可夫决策模型进行训练,选择当前状态下应该执行的动作,得到新的状态,若得到的新状态为终止状态则代表已经构建了最优的执行计划,否则继续根据动作选择策略选择下一步应该执行的动作,直至得到的新状态为终止状态则代表已经构建了最优的执行计划,最优的执行计划即为该数据仓库的多表连接查询计划选择策略。
步骤S280,根据多表连接查询计划选择策略,对目标数据仓库的数据表进行连接。
上述Spark SQL多表连接优化方法,通过获取根据目标数据仓库设计的SQL多表连接查询语句集;将SQL多表连接查询语句集划分为训练集和测试集;根据训练集和测试集,对预先构建的马尔可夫决策模型进行训练,获得目标数据仓库的多表连接查询计划选择策略;该马尔可夫决策模型是使用深度强化学习算法求解,得到目标数据仓库的多表连接查询计划选择策略,根据多表连接查询计划选择策略,对目标数据仓库的数据表进行连接。解决了Spark SQL现有的查询优化在多表连接查询计划选择时效率低、依赖开发人员经验的问题,能够快速有效地构建多表连接查询执行计划,从而提高Spark SQL执行效率。
在一个实施例中,构建马尔可夫决策模型的方式为:将Spark程序输入的SQL多表连接查询语句与数据仓库信息结合,以连接树的形式抽象为马尔可夫决策模型的状态特征;将Spark SQL原有的逻辑计划选择和物理计划选择两个阶段结合,重新设计了计划选择方法,并抽象为马尔可夫决策模型的动作特征;根据Spark SQL连接的物理实现,设计用于评估执行动作的时间代价的时间代价模型,作为马尔可夫决策模型的奖励;根据状态特征、动作特征和奖励,构建马尔可夫决策模型。
其中,为了把多表连接的执行计划选择过程转换为马尔可夫决策过程并使用强化学习方法解决,首先需要对于输入的多表连接查询SQL语句进行抽象。
在一个实施例中,将Spark程序输入的SQL多表连接查询语句与数据仓库信息结合,以连接树的形式抽象为马尔可夫决策模型的状态特征的步骤,包括:
将Spark程序输入的SQL多表连接查询语句与数据仓库信息结合,以各连接树的形式表示对应的数据表,连接树的特征以向量的形式表示为:
其中,前m位是以独热编码的形式表示的连接树中包含的连接键,最后一位Ca是连接树执行结果的预估基数,由数据仓库提供的基数估计器获取;
由各连接树组成的森林,表示为马尔可夫决策模型的状态特征。
其中,多表连接的执行计划通常可以抽象为连接树的形式,连接树是一颗二叉树,其中非叶子结点代表连接中间结果,都有两个子结点,叶子结点代表了参与连接的基本数据表,根结点代表查询的最终结果。在连接树结构的基础上设计了一种新型的连接树构建方法。首先,初始状态是由多表连接查询包含的基本数据表组成的集合,每个基本表可以抽象为一个只有根结点的连接树,则初始状态可以视为一个由表示基本表的连接树组成的森林。其次,每步操作为从该森林中选取两个连接树进行连接操作,得到的中间结果形成一个新的连接二叉树,和剩余的连接树组成新的森林,转移为新的状态。不断地进行该操作直到只剩下一个连接树,即构建了连接查询的一个连接计划。这种连接树构建方法中,可以将每一步中的森林视为是当前状态,选择两个连接树进行连接操作视为动作,每个状态下选择动作的概率以及选择动作后状态的变化情况只和当前状态有关,可以证明该连接树构建方法具有马尔可夫性。
对上述设计的连接树构建方法中的状态,连接树Ti以向量的形式进行表示:
Ti=[… 0 1 0 … Ca]
其中,前m位是以独热编码的形式表示的连接树中包含的连接键,最后一位Ca是连接树执行结果的估计基数。则状态作为连接树的集合,将其用矩阵的形式表示。使用一个n×(m+1)的矩阵来对状态进行编码,有以下的形式:
其中Si是时刻i的状态,n是应用的数据仓库中所有的关系表的个数,也是最多可能出现的连接树个数,m是数据仓库中能够作为连接键的属性个数,Cai是连接树i预估基数。每一行代表一个当前状态中的连接树,其中置1的位代表该列代表的连接键已经合并到了该行代表的连接树中,全为0的行代表该位置当前状态下不存在连接树。当矩阵中只有一行不全为0,表示达到了终止状态得到了一个连接计划树。
在一个实施例中,将Spark SQL原有的逻辑计划选择和物理计划选择两个阶段结合,重新设计了计划选择方法,并抽象为马尔可夫决策模型的动作特征的步骤,包括:从状态特征的森林中选取两个连接树L和R进行连接,并指定连接物理实现方法pa,表示为向量的形式[L,R,pa],作为马尔可夫决策模型的动作特征;其中,L代表连接左表,R代表连接右表,pa代表连接物理实现方法。
其中,马尔可夫决策模型还需要将导致状态变化的连接树合并操作抽象表示为动作向量。马尔可夫决策模型将动作特征向量设计为三元组的形式,如公式所示:
A(Si,j)=[L,R,pa]
其中,A(Si,j)表示在状态Si下选取的动作j,L和R是代表参与连接的左右子树在状态矩阵中的行数即连接树的编号,L和R的取值范围为[0,n)。pa是选用的连接操作底层实现,在Spark SQL中,等值连接的物理实现有三种方式,在动作中分别使用0、1、2表示。对于一个有n个数据表的数据仓库,其可能动作共有个,根据当前状态判断哪些动作可选。如图2所示,通过一个示例展示了一个多表连接SQL查询的连接树构建过程,并将其状态特征和动作特征按上述方式以矩阵和向量集的形式表示。示例中,数据仓库中共有三个表且每个表都有两个可以作为连接键的属性,表A、B、C三表以k属性为连接键进行多表连接,因此在初始状态中共有三个连接树,每一行置1的列为代表连接键A.k、B.k、C.k的属性在数据仓库中的位置。从数据仓库中通过基数估计模块获取三个基本表的基数,放入最后一列,构成了表示初始状态的矩阵。对于该状态,判断动作列表中的可选动作并进行选择。在示例中,第一次动作选择了[0,1,pa],即将连接树0和连接树1使用连接底层实现方法pa进行连接,则第二个状态中有两个连接树,新得到的连接树基数属性由数据仓库中的基数估计模块获取,继续进行动作选择,第三个状态中只有一个连接树,即达到了终止状态,这种表征方法抽象了数据库中表和连接键的特征,有效地区分了不同的连接中间状态,便于之后的深度强化学习模块训练。
在一个实施例中,连接物理实现方法包括:广播小表后进行哈希连接、数据混洗后进行哈希连接和数据混洗后进行排序合并连接中的任意一种以上。
其中,Spark SQL为等值连接提供了三种物理实现,包括:Broadcast Join(广播小表后进行哈希连接)、Shuffle Hash Join(数据混洗后进行哈希连接)、Sort Merge Join(数据混洗后进行排序合并连接)。以pa取值范围为{0,1,2},分别代表三种物理实现为例,即pa为0代表广播小表后进行哈希连接,pa为1代表数据混洗后进行哈希连接,pa为2代表数据混洗后进行排序合并连接。
在一个实施例中,根据Spark SQL连接的物理实现,设计用于评估执行动作的时间代价的时间代价模型,作为马尔可夫决策模型的奖励的步骤,包括:对于动作特征[L,R,pa],以连接树L和R的估计基数为输入,根据选用的连接物理实现方法pa选择代价模型,根据Spark集群计算节点的性能设置代价模型的参数,得到估算的动作时间代价,经过归一化后作为马尔可夫决策模型的奖励。
在一个实施例中,根据训练集和测试集,对预先构建的马尔可夫决策模型进行训练,获得目标数据仓库的多表连接查询计划选择策略的步骤,包括:根据训练集和测试集,采用交叉检验训练的方式对预先构建的马尔可夫决策模型进行训练,获得目标数据仓库的多表连接查询计划选择策略。
如图3所示,在一个实施例中,根据训练集和测试集,对预先构建的马尔可夫决策模型进行训练的方法具体包括以下内容:
训练的方法包括多表连接查询语句抽象模块(如图3所示的抽象模型)、基数估计与连接代价设计模块(如图3所示的代价模型)和深度强化学习训练模块(如图3所示的训练模型),多表连接查询语句抽象模块负责将多表连接的最优计划选择问题转换为马尔可夫决策过程中的状态、动作和状态转移三个部分,从Spark SQL程序输入的SQL多表连接查询语句和应用的数据仓库中抽象出能够表示当前连接树情况的状态特征、能够表示连接顺序选择和底层执行方法选择的动作特征和执行动作后状态变化的状态转移方程。基数估计与连接代价设计模块通过对Spark SQL连接操作底层执行过程的分析,设计了评判某个状态下执行某个动作资源消耗的代价模型,并以数据表和中间结果的基数作为输入进行计算,得到估算代价作为强化学习中的奖励。对于Spark SQL等值连接的三种物理实现BroadcastJoin、Shuffle Hash Join和Sort Merge Join,基数估计与连接代价设计模块分别设置为:
CostSMJ(A,B)=(Ca(A)*size(A)+Ca(B)*size(B))*T(SS)+(Ca(i)+Ca(j))*T(c)
其中,CostBJ(A,B)是Spark SQL在计算集群中对数据表A与数据表B执行BroadcastJoin的时间代价;CostSHJ(A,B)是Spark SQL在计算集群中对数据表A与数据表B执行Shuffle Hash Join的时间代价;CostSMJ(A,B)是Spark SQL在计算集群中对数据表A与数据表B执行Sort Merge Join的时间代价;Ca(i)是表i的基数,i∈A或B,A和B为数据表编号;Ca(j)是表j的基数,i≠j∈A或B;size(i)是表i每条数据平均大小,i∈A或B,A和B为数据表编号;T(BC)是Spark集群广播单位数据的时间常数,是在Spark计算集群子节点对表和表B中执行Hash Join的时间代价,是表A分配到Spark计算集群子节点中的部份表,是在Spark计算集群子节点对表和表中执行Hash Join的时间代价,是表B分配到Spark计算集群子节点中的部份表;T(HS)是集群单位数据执行Hash Shuffle的时间常数,T(SS)是集群单位数据执行Sort Shuffle的时间常数,T(c)是集群计算节点比较单位数据的时间常数。CostHJ(i,j)的时间代价模型设置为:
其中,T(hash)是集群计算节点为单位数据创建哈希表的时间常数,M是集群子节点提供的内存大小,T(w)是集群子节点写入单位数据的时间常数。当表j占用的内存Ca(j)*size(j)小于等于子节点提供的内存大小M时,Hash Join的时间代价为对表i建立哈希表的时间加上扫描表j的时间,否则时间代价要加上哈希表溢写到磁盘的时间。以上涉及到的时间常数都应该根据Spark集群的配置环境设置。对于某一状态下执行动作后,根据时间代价模型获取的代价值,进行归一化处理后作为强化学习的奖励值。
经过上述多表连接查询语句抽象模块和基数估计与连接代价设计模块将多表连接计划构建问题转换成为马尔可夫决策过程,通过深度强化学习算法进行训练。实现时使用深度强化学习DQN算法进行训练,训练收敛后得到策略矩阵,能够指导Spark SQL优化多表连接查询时更有效率地选择最优执行计划。
为验证本申请对Spark SQL多表连接查询优化性能的提升,使用建立在Imdb网络电影数据库上的JOB SQL多表连接查询集进行实验验证。实验采用交叉检验训练,以80条SQL多表连接查询语句作为训练集,33条SQL多表连接查询语句作为测试集,以不同的划分构建了四组训练集和测试集,以保证每个数据表都出现在训练集中,避免训练不充分,在本实验中将DQN的MLP网络层数设置为3取得了较好的效果,将本申请与Spark SQL现有的优化多表连接的CBO模块进行对比:
如图4所示,展示了在不同连接个数下Spark SQL现有的动态规划方法(CBO-dp)和本申请设计的基于深度强化学习的Spark SQL多表连接优化方法(CBO-drl)选择最优计划花费时间的比较,横坐标为连接个数,纵坐标为计划构建时间(ms),纵坐标用对数尺度衡量。从图中可以看出,基于动态规划的方法随着连接个数的增加呈指数级上升,而基于深度强化学习的Spark SQL多表连接优化方法因为用训练得到的马尔可夫决策模型贪心地构建,其时间复杂度约为线性的。从构建计划的效率上来看,当连接个数小于5时,基于动态规划的方法优于基于深度强化学习的Spark SQL多表连接优化方法,因为加载并计算模型中的策略神经网络需要一定的时间,但是当连接个数大于5之后,基于深度强化学习的SparkSQL多表连接优化方法显著地优于传统方法。如图5所示,展示了在不同连接个数下CBO-dp和CBO-drl构建计划并执行的时间比较。可以看出,基于深度强化学习的Spark SQL多表连接优化方法在大多数情况下都能较为准确地选择最优计划执行,在连接个数为3,6,8,9,11时总体性能显著地优于传统的方法。平均而言,CBO-drl比CBO-dp执行速度提升15.2%。
应该理解的是,虽然图1的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图6所示,提供了一种Spark SQL多表连接优化装置,包括:语句集获取模块310、划分模块320、训练模块330和连接模块340。
语句集获取模块310,用于获取根据目标数据仓库设计的SQL多表连接查询语句集。
划分模块320,用于将SQL多表连接查询语句集划分为训练集和测试集。
训练模块330,用于根据训练集和测试集,对预先构建的马尔可夫决策模型进行训练,获得目标数据仓库的多表连接查询计划选择策略。
连接模块340,用于根据多表连接查询计划选择策略,对目标数据仓库的数据表进行连接。
关于Spark SQL多表连接优化装置的具体限定可以参见上文中对于Spark SQL多表连接优化方法的限定,在此不再赘述。上述Spark SQL多表连接优化装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现上述的Spark SQL多表连接优化方法的步骤。
在一个实施例中,提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述的Spark SQL多表连接优化方法的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成的,计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。