法律状态公告日
法律状态信息
法律状态
2019-07-05
专利权的转移 IPC(主分类):G06F17/30 登记生效日:20190617 变更前: 变更后: 申请日:20141204
专利申请权、专利权的转移
2017-08-08
授权
授权
2015-05-06
实质审查的生效 IPC(主分类):G06F17/30 申请日:20141204
实质审查的生效
2015-04-08
公开
公开
技术领域
本发明涉及一种游标构造方法,特别是涉及一种面向海量分布式关系数据库的游标构造方法。
背景技术
文献“海量结构化数据存储管理系统OceanBase.阳振坤,杨传辉,李震.科研信息化技术与应用,2013,4(1):41–48”公开了一种融合了NOSQL数据库架构和关系数据库特点的新型数据库架构-OceanBase,不仅支持跨行跨表的事务的强一致性,也支持数据节点的可扩展性。该数据库是一个架构于MySQL数据库之上的开源分布式数据库,支持通用的SQL查询语言,通过对输入的SQL语句进行词法分析、语法分析、逻辑计划生成和物理计划生成,并将数据划分为静态数据和动态数据,每次查询时即时的提供动态数据和静态数据的融合,来完成分布式的关系数据查询。但是,目前Oceanbase中语法树、逻辑计划和物理计划中缺少对游标功能的构造,导致其无法支持游标,而游标是金融应用中常用的功能,提供数据集合的批量处理,特别是在银行大规模数据集业务中使用广泛,这对于传统金融行业,是非常大的制限。
发明内容
为了克服现有OceanBase中SQL处理流程对于游标功能构造缺失的不足,本发明提供一种面向海量分布式关系数据库的游标构造方法。该方法以SQL92标准语法为依据,基于海量分布式数据库的架构,设计了完整的游标构造方法,根据游标常用关键字,构造了统一的语法树、逻辑计划和物理计划,并设计了游标SQL的执行流程。该方法能够完成分布式数据库的游标功能并在大数据量查询时,具有较优的查询性能。通过与商用数据库DB2在100万数据集上的游标执行性能对比,本发明方法构造的游标性能比DB2的查询速度快70倍左右。
本发明解决其技术问题所采用的技术方案是:一种面向海量分布式关系数据库的游标构造方法,其特点是采用以下步骤:
步骤一、构建语法树;
语法树是SQL语句经过词法和语法解析后生成的数据结构,根据SQL不同语法树有所不同。游标涉及的关键字包括:Declare、Open、Fetch、Close和Deallocate,游 标的名称是所有节点共通的部分,用来区分不同的游标。此外,Declare语句中要包含Select查询部分,需要有第二个子节点,Fetch语句中要输入获取数据的方向,从第一条记录开始取数据或者从最后一条记录开始取数据。具体生成流程如下:
1.Input:游标关键字类型
2.生成根节点(Cursor keyword)node;
3.生成子节点children_[0],存放游标定义名称cursor_name;
4.If(游标关键字类型=Declare或Fetch)
{生成子节点children_[1];
if(游标关键字类型=Declare)
{children_[1]=(select)node;
Else
children_[1]=fetch_direction;
}
5.语法树生成完成
作为游标语法树,其数据结构分为根节点和子节点,根节点存放游标关键字类型,子节点为childen_[0]和childen_[1]。childen_[0]是游标的每个关键字必须构造的节点,主要是存储游标名称。childen_[1]只有Declare和Fetch关键字需要构造,Declare用来构造语句中所包含的Select查询的相关信息(select)node。Fetch用来存储取得数据方向的信息fetch_direction。
步骤二、构建逻辑计划;
逻辑计划是根据语法树生成的数据结构,需要根据语法树内容,将SQL语句中所涉及到的表、字段和表达式解析出来并判断有效性,但逻辑计划不可执行。
在一个逻辑计划中,每一个查询有一个唯一标识query_id,每一张表有一个唯一的标识tid,每一个列有一个唯一的标识cid,每一个表达式有一个唯一的标识eid。
逻辑计划生成过程如下:
1.Input:游标语法树
2.生成逻辑计划根节点Logic_plan,创建存储容器ObVector<ObBasicStmt>stms_;
3.生成子节点stms_[0];
4.生成游标容器cursor_stmt,存放游标查询信息query_id,游标名称curor_name, 查询语句类型stmt_type;
5.If(游标关键字类型=Declare),生成declare_query_id,存入cursor_stmt;
6.If(游标关键字类型=Fetch),生成fetch_direction,存入cursor_stmt;
7.stms_[0]=cursor_stmt;
8.If(游标关键字类型=Declare)
{生成子节点children_[1];
children_[1]=(select)node;
}
9.逻辑计划生成完成。
游标逻辑计划的构造也包含根节点和子节点生成,根节点中包含逻辑计划容器ObVector<ObBasicStmt>stms_,子节点包括stms_[0]和stms_[1],stms_[0]存放查询标识query_id、游标名称cursor_name、逻辑计划类型stmt_type,当游标关键字为Declare和Fetch时,还要生成declare_query_id和fetch_direction。stms_[1]仅在关键字为Declare时生成,保村其中查询语句的相关信息select_stmt。
步骤三、构建查询物理计划;
物理计划是一系列数据操作的有序集合,由逻辑计划解析而成,是可执行的最终数据结构。物理计划按照物理操作符的顺序执行,由于Oceanbase并未支持游标,因此所有的物理操作符需要重新设计。游标的物理操作符分别定义为:ObDeclare、ObOpen、ObFetch、ObClose和ObDeallocate。物理计划的生成流程如下:
1.Input:游标逻辑计划
2.生成根节点ObPhysicalPlan,保存主查询信息Main_query;
3.生成子节点cursor_phyOp,保存游标物理操作符;
4.If(游标关键字类型=Declare)
{生成子节点child_op;
child_op=Select物理操作符;}
5.物理计划生成完成。
游标的物理计划中,cursor_phyOp代表游标的物理操作符,根据关键字的不同有所变化,可选节点信息是针对declare节点中所包含的Select查询语句的物理操作符信息,由于Select物理操作符的设计在Oceanbase中已经完成,因此不加以展开。
步骤四、游标执行流程设计;
游标的执行流程类似于其他SQL的执行流程,构造完游标各个阶段的数据结构之后,完成游标功能的执行。游标执行流程如下:
1.Input:游标SQL
2.词法语法解析,生成游标语法树;
3.逻辑计划生成,输出游标逻辑计划;
4.物理计划生成,输出游标物理计划;
5.物理计划执行,输出查询结果,返回客户端。
游标中Declare、Open、Fetch、Close和Deallocate语句都是新加的SQL语句。除Declare语句不执行物理计划,Open、Fetch、Close和Deallocate语句都需要执行物理计划来生成对于数据结构。
Declare语句是存储Select语句的物理计划和游标的名字。
Open语句通过游标名找到与之对应的Select语句物理计划并执行,缓存Select语句的结果集。对于结果集的缓存方式,考虑了内排和外排两种情况:当内存可以放下全部数据时,排序只有一路;当内存不能放下全部数据时,排序会是多路,中间结果刷到外存上。
Fetch语句通过游标名找到与之相关的结果集,单向单行地取结果集中的一行数据。
Close语句通过游标名找到与之相关的结果集,关闭游标并释放结果集。
Deallocate语句通过游标名找到与之相关的物理计划,删除物理计划,释放游标。
本发明的有益效果是:该方法以SQL92标准语法为依据,基于海量分布式数据库的架构,设计了完整的游标构造方法,根据游标常用关键字,构造了统一的语法树、逻辑计划和物理计划,并设计了游标SQL的执行流程。该方法能够完成分布式数据库的游标功能并在大数据量查询时,具有较优的查询性能。通过与商用数据库DB2在100万数据集上的游标执行性能对比,本发明方法构造的游标性能比DB2的查询速度快70倍左右。
下面是游标的性能测试实验。
实验环境:Oceanbase单服务器部署。服务器由1T硬盘,16G内存,16核CPU,一块网卡组成。服务器操作系统是Red Hat6.2,内核是2.6.32-220.el6.x86_64。
实验目的:测试Oceanbase和DB2的游标功能在100万级数据量的表中取数据的 性能差异。表中有100万数据,结果集为各种数据量(1万到80万),Fetch完所有数据,测open和fetch语句取全部结果集的执行时间。
测试SQL语句模板如下所示。
1、declare cursor csr1 for select*from test_100w where id<n
2、open csr1
3、fetch csr1
4、close csr1
表1 OB与DB2游标性能测试
表1结果表明:随着数据量的增加,Oceanbase的游标获取数据的时间远远小于DB2,查询速度更快,性能优于DB2。这也体现了分布式数据库在大数据量查询时的优势。
下面结合附图和具体实施方式对本发明作详细说明。
附图说明
图1是本发明方法构造的Declare关键字的语法树;
图2是本发明方法构造的Declare关键字的逻辑计划;
图3是本发明方法构造的Declare关键字的物理计划;
图4是本发明方法中游标的执行流程。
具体实施方式
参照图1-4。本发明面向海量分布式关系数据库的游标构造方法具体步骤如下:
对于如下的游标的Declare语句SQL:
Declare Cursor cs1 for select c1,c2 from test;
可按照如下的步骤实现游标。
1)构建语法树:构造Declare关键字的语法树。构造流程如下:
1.Input:Declare关键字
2.生成根节点(Declare)node;
3.生成子节点children_[0],存放游标定义名称cs1;
4.因为(游标关键字类型=Declare)
{生成子节点children_[1];
children_[1]=(select)node;}
5.语法树生成完成
2)构建逻辑计划:构造游标Declare的逻辑计划。构造流程如下:
1.Input:Declare语法树
2.生成逻辑计划根节点Logic_plan,创建存储容器ObVector<ObBasicStmt>stms_;
3.生成子节点stms_[0];
4.生成游标容器cursor_stmt,存放游标查询信息query_id,游标名称cs1,查询语句类为select;
5.因为(游标关键字类型=Declare),生成declare_query_id,存入cursor_stmt;
6.stms_[0]=cursor_stmt;
7.生成子节点children_[1];children_[1]=(select)node;
8.逻辑计划生成完成。
3)构建物理计划:构造游标Declare的物理计划。构造流程如下:
1.Input:Declare逻辑计划
2.生成根节点ObPhysicalPlan,保存主查询信息Main_query;
3.生成子节点cursor_phyOp,保存游标物理操作符;
4.因为(游标关键字类型=Declare)
5.{生成子节点child_op;
6.child_op=Select物理操作符;}
7.物理计划生成完成。
4)游标的执行流程:Declare的SQL语句首先通过词法和语法解析后,生成语法树,相应的处理程序从语法树解析出表名、列名、并赋予查询ID后将其转换为逻辑计划,逻辑计划进一步转换为可执行的物理计划,并在ChunkServer上执行,获得静态数据,和UpdateServer上的动态数据融合,将结果返回给客户端,执行流程如下:
1.Input:Declare Cursor cs1 for select c1,c2 from test;
2.词法语法解析,生成游标语法树;
3.逻辑计划生成,输出游标逻辑计划;
4.物理计划生成,输出游标物理计划;
5.物理计划执行,输出查询结果,返回客户端。
5)作用效果:由于采用了技术方案中的游标构造方法,解决了Oceanbase中无法存储游标数据、构造游标执行流程的问题,实现了游标功能。通过与商用数据库DB2在100万数据集上的游标执行性能对比,本发明的游标性能比DB2的查询速度快70倍左右。下面是游标的性能测试实验。
● 实验环境:Oceanbase单服务器部署。服务器由1T硬盘,16G内存,16核CPU,一块网卡组成。服务器操作系统是Red Hat6.2,内核是2.6.32-220.el6.x86_64。
● 实验验证:
实验目的:测试Oceanbase和DB2的游标功能在100万级数据量的表中取数据的性能差异。表中有100万数据,结果集为各种数据量(1万到80万),Fetch完所有数据,测open和fetch语句取全部结果集的执行时间。
测试SQL语句模板如下所示。
1.declare cursor csr1 for select*from test_100w where id<n;
2.open csr1
3.fetch csr1
4.close csr1
表2 OB与DB2游标性能测试
表2结果表明:随着数据量的增加,Oceanbase的游标获取数据的时间远远小于DB2,查询速度更快,性能优于DB2。这也体现了分布式数据库在大数据量查询时的优势。
机译: 一种将关系数据库模式映射到面向对象的模式以具有共存关系数据库的方法
机译: 用于根据面向对象的方法逻辑来限制关系数据库的关系数据库的管理系统
机译: 适用于各种云的海量数据分布式处理系统的安装系统和安装方法及其分布式处理系统