一种数据库系统及分布式sql语句执行计划重用方法

文档序号:6576356阅读:161来源:国知局
专利名称:一种数据库系统及分布式sql语句执行计划重用方法
技术领域
本发明涉及数据库系统领域,特别是涉及了 一种数据库系统及分 布式结构化查询语言(Structured Query Language, SQL)语句扭^亍计划 重用方法。
背景技术
在数据库界,最为普遍接受的语法标准是SQL92,即ansi x3.135-1992中"数据库语言SQL"—节所规定的语法标准,该标准规 定了数据库用户操作数据库服务器的接口标准,它是一种纯文本接 口,这就意味着在任何支持SQL92标准的数据库中, 一定会存在 将客户端发来的SQL语句文本串转换为内部可执行数据结构和代码 的过程,这种转换后的内部数据结构和代码在数据库界通称为"执行 计划",这种转换过程通称为"硬解析"。
由于SQL语法本身的可扩展、可连接、可嵌套等特性, 一个SQL 语句可能复杂到匪夷所思的程度,SQL语法解析器要做到通用和兼 容,必须各种语句都要支持,所以硬解析是极其复杂和耗时的过程, 若每个SQL语句执行时都硬解析一次,那么数据库的性能必定是极 其低下的。因此,为了提高性能,任何商用数据库都会有执行计划重 用功能,即相同语句仅在第一次执行时进行硬解析,解析完成后SQL 语句及其执行计划被緩存下来,再次执行相同语句时,通过对SQL 语句进行hash运算匹配到上次的4丸行计划,就可以重用执行计划, 省去了大量的硬解析4喿作。
可以看出,对SQL语句进行hash运算的过程十分关键,该运算 的速度和结果离散度直接决定了执行计划重用的速度。如图l所示, 在传统的数据库中,SQL语句匹配的过程都是在数据库服务端进行 的,客户端仅负责发送语句和接收结果;而服务端不仅需要对所有接 收到的SQL语句进行hash运算,并且还要对第一次执行的SQL语句
5进行硬解析并存储,当服务端连接的客户端非常多、执行语句非常频
繁时,hash匹配运算对服务端也将产生巨大的压力,离散度越高的 hash算法会导致服务端的中央处理器(CPU)负荷越高,这个问题在 内存数据库中体现得尤其明显,因为内存数据库几乎没有I/O的负担, 所以瓶颈一定是体现在CPU密集型操作上,而hash运算就是一种典 型的CPU密集型操作。
这种完全集中于服务端的SQL匹配模式有以下弊端
1、 所有hash运算压力完全放在服务端,客户端除了发送语句和 接收结果外什么都不做,造成等待结果期间客户端计算能力的闲置和 浪费;
2、 全部在服务端进行CPU密集型的hash运算将造成服务端的 性能瓶颈,不利于客户端数量的扩展,也影响了后续其余处理步骤的 效率。

发明内容
本发明所要解决的技术问题是,提供一种数据库系统及分布式 SQL语句执行计划重用方法,本发明减轻了数据库服务器的负担,也 提高了数据库系统的计算能力使用率。
本发明公开了 一种数据库系统,包括客户端服务器和数据库服务 器,所述
客户端服务器用于在启动时创建hash表,用于对用户发送的SQL 语句进行hash运算,以及根据得到的hash表下标值从所述hash表中 查找相应SQL语句在服务端的执行计划緩存数组的下标值,并在查 找到时,读取所述下标值,并将所述SQL语句与所述下标值发送给 所述数据库服务器;在未查找到时将仅所述SQL语句发送给所述数 据库服务器;
数据库服务器用于在启动时创建执行计划緩存数组,用于解析并 判断所述客户端服务器发送来的请求包中是否携带有合法有效的下 标值,并在解析结果中存在合法有效的下标值时,通过所述下标值查 找相应的执行计划并使用所述执行计划执行,将执行结果返回给所述客户端服务器;在解析结果中不存在下标值或者下标值非法/失效时, 硬解析所述请求包携带的SQL语句,并在所述执行计划緩存数组中 为其分配空闲节点,将硬解析得到的执行计划和所述SQL语句存入 所述节点,记录所述节点的下标值,使用得到的执行计划执行,将执 行结果和所述记录的下标值返回给所述客户端服务器。
所述客户端服务器还用于解析所述数据库服务器返回的响应包, 将执行结果返回给用户,用于判断所述响应包中是否携带有下标值; 在响应包携带有下标值时,判断本地hash表中是否存在当前SQL语 句,若存在,则将其对应的下标值更新成当前解析得到的下标值;若 不存在,则将当前SQL语句和解析得到的下标值存入本地hash表中。
本发明还在所述数据库系统的基础上公开了一种分布式SQL语 句执行计划重用方法,所述方法包括
客户端接收到用户的SQL语句后,对其进行hash运算,根据得 到的hash表下标值在本地hash表中查找所述SQL语句,找到后读取 所述SQL语句在服务端执行计划緩存数组中的下标值,将所述SQL 语句和所述下标值发送给服务端;
服务端接收到客户端的请求包后,解析所述请求包,根据得到的 SQL语句和执行计划緩存数组下标值,找到相应的执行计划并使用所 述执行计划执行,执行结束后将结果返回给所述客户端。
若所述客户端在本地hash表中没有查找到所述SQL语句,则仅 将所述SQL语句发送给所述服务端。
若所述服务端从接收到的请求包中没有携带下标值或者携带的 下标值非法/失效,则执行如下操作
步骤a:硬解析所述SQL语句,得到执行计划;
步骤b:在执行计划緩存数组中为所述SQL语句分配一个空闲节 点,将所述SQL语句及其执行计划存入所述节点,并记录所述节点 的下标值;
步骤c:使用所述执行计划执行,得到执行结果; 步骤d:将执行结果和记录的下标值返回给所述客户端。 所述客户端接收到服务端返回的响应包后,执行如下步骤 步骤A:解析并判断所述响应包中是否携带有下标值,若是,则执行步骤B;否则,执行步骤C;
步骤B:根据hash表下标值查找本地hash表中是否存在当前SQL 语句,若是,则将其对应的执行计划緩存数组下标值更新成解析得到 的下标值;否则,根据所述hash表下标值将当前SQL语句和解析得 到的下标值存入本地hash表中;
步骤C:将执行结果返回给用户。
所述方法还包括
所述客户端在启动时创建hash表;
所述服务端在启动时创建执行计划緩存数组。
所述hash表的记录数大于等于本客户端上可执行的SQL语句种 类数,且每条记录都具有一个冲突链表;
所述执行计划緩存数组的节点数大于等于数据库系统的SQL语 句种类数,且每个节点都具有指针。
所述客户端将hash表下标值相同的SQL语句及其执行计划緩存 数组下标值存储在所述hash表下标值对应记录的冲突链表的不同节 点巾。
所述服务端硬解析得到SQL语句的执行计划后,将所述SQL语 句及其执行计划存入预先申请的结构体中,并使得为该SQL语句分 配的执行计划緩存数组的节点的指针指向所述结构体;
所述客户端通过遍历所述hash表记录的沖突链表来查找其中是 否存在当前SQL语句。
本发明将对SQL语句进行hash运算的过程分散到所有客户端, 从而将运算负荷平均分布到整个数据库系统中所有成员机器,不仅大 大减轻了数据库服务器的负担,极大地提高了数据库服务器的处理能 力,也提高了整个数据库系统的计算能力使用率。


图l是传统的执行计划重用方法示意图2是本发明所述系统示意图3是本发明所述方法总体流程示意图4是本发明所述方法实施例一流程示意图。
8
具体实施例方式
以下结合附图和优选实施例,对本发明做进一步详细说明。
如图2所示,是本发明所述数据库系统示意图,包括客户端服务 器和数据库服务器,客户端服务器与数据库服务器直接以TCP/IP协
议通信,客户端服务器与数据库服务器之间的关系可以是一对多、多
对一或者多对多,本实施例采用多对一模式,即包括N个客户端服
务器和一个数据库服务器的模式,其中
客户端服务器用于在启动时创建记录数大于等于本客户端上可
执行的SQL语句种类数的hash表;用于对用户发送的SQL语句进行
hash运算,以及根据得到的hash表下标值从hash表中查找相应SQL
语句在服务端的执行计划緩存数组的下标值,并在查找到时,读取所
述下标值,并将所述SQL语句与所述下标值发送给数据库服务器;
在未查找到时将仅所述SQL语句发送给数据库服务器;还用于解析
数据库服务器返回的响应包,将执行结果返回给用户,用于判断响应
包中是否携带有下标值;在响应包携带有下标值时,判断本地hash表中是否存在当前SQL语句,若存在,则将其对应的下标值更新成
当前解析得到的下标值;若不存在,则将当前SQL语句和解析得到
的下标值存入本地hash表中。
数据库服务器用于在启动时创建节点数大于等于数据库系统的
SQL语句种类数的执行计划緩存数组,用于解析并判断所述客户端服 务器发送来的请求包中是否携带有合法有效的下标值,并在解析结果 中存在合法有效的下标值时,通过所述下标值查找相应的执行计划并 使用所述执行计划执行,将执行结果返回给客户端服务器;在解析结 果中不存在下标值或者下标值非法/失效时,硬解析所述请求包携带 的SQL语句,并在所述执行计划緩存数组中为其分配空闲节点,将 硬解析得到的执行计划和所述SQL语句存入所述节点,记录所述节 点的下标值,使用得到的执行计划执行,将执行结果和所述记录的下 标值返回给客户端服务器。
如图3所示,是本发明优选实施例中hash表和执行计划緩存凄史 组的结构示意图,本实施例中,
客户端启动时创建的hash表的记录数为M,每条记录都具有一个冲突链表,本实施例中,假设记录M-1的沖突链表中存储有两个
SQL语句及其下标值,其余的都为空,客户端将hash运算得到的hash 表下标值相同的SQL语句及其在数据库服务器的执行计划緩存数组 的下标值存储在运算得到的hash表下标值记录的冲突链表的不同节 点中;当需要查找时,则根据所述运算得到的hash表下标值定位到 相应的记录,然后再遍历该记录的冲突链表即可。
数据库服务器启动时创建的执行计划緩存数组的节点数为n,每
个节点都具有voi^指针,数据库服务器硬解析SQL语句后,将得到 的执行计划和SQL语句先存入一个预先申请的结构体中,然后使得 为该SQL语句分配的数组节点的指针指向所述结构体。
如图4所示,是本发明所述方法的实施例流程示意图,本实施例
中,假设客户端和服务器端都已启动,即客户端已创建了一个通常意 义上的hash表(hash表在计算机业界有通用的定义和现成的代码, 本发明中不再详细叙述),表名为hashjab, hash—tab的最大记录数为 n; hash—tab的每条记录都含有一个沖突链表,hash表下标值相同的 SQL语句及其执行计划緩存数组下标值被存放在此链表的一个节点 中;服务端也已创建了一个长度为max—saved—plans的数组,数组名 为array—server; 具体包括如下步骤
步骤401:客户端收到一个SQL语句,设长度为SQLJen;
步骤402:对所述SQL语句进行hash运算,得到hash值hash—val, 用hash—val对n取模,得到hash_tab下标值hash—tab—foot,并定位到 hash—tab的hash—tab—foot的冲突链表头节点head—node;
这里的hash算法的应适用于长度不定的字符串处理并且适应于 本机CPU处理能力。
步骤403:从head—node开始遍历冲突链表,将本次待执行的SQL 语句和存储在每一个节点的SQL语句进行比较;
步骤404:判断是否找到,若找到,则执行步骤405;否则,执 行步骤406;
本步骤中,若该SQL语句是第一次执行,则找不到,否则,可 以找到;步骤405:取出其中存储的下标值achieved—node—foot,将SQL 语句和achieved_node—foot打包发送给"良务端,并等待服务端返回响 应包;
步骤406:将SQL语句打包发送给服务端,并等待服务端返回响 应包;
步骤407:服务端收到客户端的请求包;
步骤408:解析并判断是否携带了下标值,若是,则执行步骤409; 否则,执行步骤410;
步骤409:判断解析得到的下标值achieved_node—foot是否合法 有效,若是,则执行步骤412;否则,执行步骤410;
步骤410:对解析得到的SQL语句进行硬解析,得到执行计划 exe_plan;
硬解析的算法可以采用通用的flex和yyac配合的方式实现。
步骤411 : 从array—server中分配 一 个空闲节点,设为 achieved一node, 其下才示j直为achieved—node—foot; 一夺所述SQL "i吾句禾口 得到的执行计划存入预先申请的结构体中,并使得achieved—node执 行该结构体,记录achieved—node下标值achieved—node—foot;
步骤412:使用exejlan执行,得到执行结果;
步骤413:将才丸行结果和achieved—node—foot打包返回症会客户端;
步骤414: #4居下才示<直achieved—node—foot才戈到array—server的 achieved—node—foot节点,读耳又只寸应的4丸4亍i十戈寸exe_plan;
步骤415:使用读取的exejlan执行,得到执行结果;
步骤416:将执行结果返回给客户端;
步骤417:客户端接收到服务端的响应包;
步骤418:解析并判断响应包中是否携带有下标值,若是,则执 行步骤419;否则,执行步骤420;
步骤419:判断hash—tab的hash—tab—foot的冲突链表中是否存在 当前SQL语句,若是,则执行步骤420;否则,执行步骤421;
本步骤与步骤403采用的方法相同,都是通过遍历所述冲突链 表,用当前SQL语句和存储在所述冲突链表的每一个节点的SQL语句进行比较,若找到相同的,则存在;否则,不存在。
步骤420:将该SQL语句对应的下标值更新成解析出的下标值 achieved—node—foot,执行步骤422;
步骤421:将当前SQL语句和achieved—node—foot存入hash—tab 的hash—tab—foot记录的冲突《连表中;
步骤422:将解析出的执行结果返回给用户。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明, 凡在本发明的精神和原则之内,所作的任何修改,等同替换,改进等, 均应包含在本发明的保护范围之内。
权利要求
1、一种数据库系统,包括客户端服务器和数据库服务器,其特征在于,所述客户端服务器用于在启动时创建hash表,用于对用户发送的结构化查询语言SQL语句进行hash运算,以及根据得到的hash表下标值从所述hash表中查找相应SQL语句在服务端的执行计划缓存数组的下标值,并在查找到时,读取所述下标值,并将所述SQL语句与所述下标值发送给所述数据库服务器;在未查找到时将仅所述SQL语句发送给所述数据库服务器;数据库服务器用于在启动时创建执行计划缓存数组,用于解析并判断所述客户端服务器发送来的请求包中是否携带有合法有效的下标值,并在解析结果中存在合法有效的下标值时,通过所述下标值查找相应的执行计划并使用所述执行计划执行,将执行结果返回给所述客户端服务器;在解析结果中不存在下标值或者下标值非法/失效时,硬解析所述请求包携带的SQL语句,并在所述执行计划缓存数组中为其分配空闲节点,将硬解析得到的执行计划和所述SQL语句存入所述节点,记录所述节点的下标值,使用得到的执行计划执行,将执行结果和所述记录的下标值返回给所述客户端服务器。
2、如权利要求1所述的数据库系统,其特征在于,将执行结果返回给用户,用于判断所述响应包中是否携带有下标值; 在响应包携带有下标值时,判断本地hash表中是否存在当前SQL语 句,若存在,则将其对应的下标值更新成当前解析得到的下标值;若 不存在,则将当前SQL语句和解析得到的下标值存入本地hash表中。
3、 一种分布式SQL语句执行计划重用方法,其特征在于, 客户端接收到用户的SQL语句后,对其进行hash运算,根据得 到的hash表下标值在本地hash表中查找所述SQL语句,找到后读取 所述SQL语句在服务端执行计划緩存数组中的下标值,将所述SQL 语句和所述下标值发送给服务端;服务端接收到客户端的请求包后,解析所述请求包,根据得到的SQL语句和执行计划緩存数组下标值,找到相应的执行计划并使用所述执行计划执行,执行结束后将结果返回给所述客户端。
4、 如权利要求3所述的分布式SQL语句执行计划重用方法,其 特征在于,若所述客户端在本地hash表中没有查找到所述SQL语句, 则仅将所述SQL语句发送给所述服务端。
5、 如权利要求3所述的分布式SQL语句执行计划重用方法,其 特征在于,若所述服务端从接收到的请求包中没有携带下标值或者携 带的下标值非法/失效,则执行如下操作步骤a:硬解析所述SQL语句,得到执行计划;步骤b:在执行计划緩存数组中为所述SQL语句分配一个空闲节点,将所述SQL语句及其执行计划存入所述节点,并记录所述节点的下标值;步骤c:使用所述执行计划执行,得到执行结果;步骤d:将执行结果和记录的下标值返回给所述客户端。
6、 如权利要求3或5所述的分布式SQL语句执行计划重用方法, 其特征在于,所述客户端接收到服务端返回的响应包后,执行如下步 骤步骤A:解析并判断所述响应包中是否携带有下标值,若是,则 执行步骤B;否则,执行步骤C;步骤B:根据hash表下标值查找本地hash表中是否存在当前SQL 语句,若是,则将其对应的执行计划緩存数组下标值更新成解析得到 的下标值;否则,根据所述hash表下标值将当前SQL语句和解析得 到的下标值存入本地hash表中;步骤C:将执行结果返回给用户。
7、 如权利要求3所述的分布式SQL语句执行计划重用方法,其 特征在于,所述方法还包括所述客户端在启动时创建hash表;所述服务端在启动时创建执行计划緩存数组。
8、 如权利要求7所述的分布式SQL语句执行计划重用方法,其 特征在于,所述hash表的记录数大于等于本客户端上可执行的SQL 语句种类数,且每条记录都具有一个沖突链表;所述执行计划緩存数组的节点数大于等于数据库系统的SQL语 句种类数,且每个节点都具有一个指针。
9、 如权利要求8所述的分布式SQL语句执行计划重用方法,其 特征在于,所述客户端将hash表下标值相同的SQL语句及其执行计 划缓存数组下标值存储在所述hash表下标值对应记录的冲突链表的 不同节点中。
10、 如权利要求3或8所述的分布式SQL语句l丸行计划重用方 法,其特征在于,所述服务端硬解析得到SQL语句的执行计划后, 将所述SQL语句及其执行计划存入预先申请的结构体中,并使得为 该SQL语句分配的执行计划緩存数组的节点的指针指向所述结构体;所述客户端通过遍历所述hash表记录的冲突链表来查找其中是 否存在当前SQL语句。
全文摘要
本发明涉及一种数据库系统及分布式SQL语句执行计划重用方法,所述系统包括客户端服务器和数据库服务器;所述方法为客户端接收到用户的SQL语句后,对其进行hash运算,根据得到的hash表下标值在本地hash表中查找所述SQL语句,找到后读取所述SQL语句在服务端执行计划缓存数组中的下标值,将所述SQL语句和所述下标值发送给服务端;服务端接收到客户端的请求包后,解析所述请求包,根据得到的SQL语句和执行计划缓存数组下标值,找到相应的执行计划并使用所述执行计划执行,执行结束后将结果返回给所述客户端。本发明减轻了数据库服务器的负担,也提高了数据库系统的计算能力使用率。
文档编号G06F17/30GK101567006SQ20091010777
公开日2009年10月28日 申请日期2009年5月25日 优先权日2009年5月25日
发明者丁奇鹏 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1