一种处理结构化查询语言sql的方法及装置的制造方法

文档序号:8258851阅读:166来源:国知局
一种处理结构化查询语言sql的方法及装置的制造方法
【技术领域】
[0001]本发明实施例涉及数据库技术领域,尤其涉及一种处理结构化查询语言SQL的方法及装置。
【背景技术】
[0002]SQL (Structured Query Language,结构化查询语言)是一种对数据库继续查询和程序设计语句,用于存储数据以及查询、更新和管理数据库关系。对于数据量较大的数据库,运行针对大范围数据或者大数据量进行统计查询的SQL(Structured Query Language,结构化查询语言)语句的速度较慢。
[0003]目前,为了提升数据库运行SQL语句的速度,针对查询较多、写入较少、定时写入或者没有写入的列表,采用预先计算的方法运行SQL语句。预先计算的方法主要包括:首先,计算经常运行的SQL语句的结果,将结果存储到中间结果表中;然后,再次接收相同的SQL语句时,从中间结果表取出预先计算的结果。为避免预计算结果数量过大,所以一般将这种技术应用在统计分析的SQL语句上,这类语句常包含count、sum、max和min等聚合函数。
[0004]但是,预先计算的方法只能应用于完全相同的SQL语句,并且查询条件也完全相同,无法自动的处理新加入的SQL语句。

【发明内容】

[0005]本发明实施例提供一种运行SQL语句的方法及装置,以实现提高用户的检索效率。
[0006]一方面,本发明实施例提供了一种处理结构化查询语言SQL的方法,包括:
[0007]获取客户端发送的SQL语句;
[0008]解析所述SQL语句,获得语法分析树;
[0009]依据所述语法分析树从所述SQL语句中提取规范的SQL语句;
[0010]判断所述SQL语句是否符合预设的规则,若符合,则判断中间结果表中是否缓存有与所述规范的SQL语句对应的查询结果,若无,则查询所述规范SQL语句,获得查询结果;
[0011]将所述查询结果缓存到所述中间结果表中。
[0012]优选地,所述规范的SQL语句为所述语法分析树的叶子节点对应的SQL语句。优选地,预设的规则包括以下至少一项:
[0013]所述SQL语句拼写正确;
[0014]所述SQL语句为SELECT语句;
[0015]如无需动态更新缓存,所述SQL语句支持count、max、min、avg和sum类型的聚合函数;
[0016]如需要支持动态更新缓存,所述SQL语句不支持avg类型的聚合函数;
[0017]所述SQL语句不支持的表名列表和黑名单制;
[0018]所述SQL语句不支持包括具有group by和having关键词的语句;
[0019]所述SQL语句不包括超过一级以上子查询。
[0020]优选地,在所述判断中间结果表中是否缓存有与所述规范的SQL语句对应的查询结果,若无,则查询所述规范SQL语句,获得查询结果,并将所述查询结果缓存到所述中间结果表中之后,还包括:
[0021]按照预设的时间间隔,更新所述中间结果表。
[0022]优选地,所述更新所述中间结果表包括:
[0023]删除所述中间结果表中超过预设时间未被访问的查询结果。
[0024]另一方面,本发明实施例提供了一种处理结构化查询语言SQL的装置,包括:
[0025]SQL语句获取模块,用于获取客户端发送的SQL语句;
[0026]SQL语句解析模块,用于解析所述SQL语句,获得语法分析树;
[0027]规范的SQL语句提取模块,用于依据所述语法分析树从所述SQL语句中提取规范的SQL语句;
[0028]预设规则判断模块,用于判断所述SQL语句是否符合预设的规则;
[0029]SQL语句查询模块,用于判断中间结果表中是否缓存有与所述规范的SQL语句对应的查询结果,若无,则查询所述规范SQL语句,获得查询结果;
[0030]查询结果缓存模块,用于将所述查询结果缓存到所述中间结果表中。
[0031]优选地,所述规范的SQL语句为所述语法分析树的叶子节点对应的SQL语句。优选地,预设的规则包括以下至少一项:
[0032]所述SQL语句拼写正确;
[0033]所述SQL语句为SELECT语句;
[0034]如无需动态更新缓存,所述SQL语句支持count、max、min、avg和sum类型的聚合函数;
[0035]如需要支持动态更新缓存,所述SQL语句不支持avg类型的聚合函数;
[0036]所述SQL语句不支持的表名列表和黑名单制;
[0037]所述SQL语句不支持包括具有group by和having关键词的语句;
[0038]所述SQL语句不包括超过一级以上子查询。
[0039]优选地,所述装置还包括:中间结果表更新模块,用于按照预设的时间间隔,更新所述中间结果表。
[0040]优选地,所述中间结果表更新模块,具体用于删除所述中间结果表中超过预设时间未被访问的查询结果。
[0041]通过本发明实施例提供的一种处理结构化查询语言SQL的方法及装置,当中间结果表中未缓存SQL对应的查询结果,可以自动校验SQL语句是都符合预设的规则,对符合预设规则的SQL语句进行查询,并将查询结果缓存到中间结果表中。
【附图说明】
[0042]为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0043]图1为本发明实施例提供的一种处理结构化查询语言SQL的方法流程示意图;
[0044]图2为本发明实施例提供的一种语法分析树示意图;
[0045]图3为本发明实施例提供的一种处理结构化查询语言SQL的方法流程示意图;
[0046]图4为本发明实施例提供的一种处理结构化查询语言SQL的装置结构示意图。
【具体实施方式】
[0047]下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
[0048]实施例一
[0049]本发明实施例提供的一种处理结构化查询语言SQL的方法,该方法可适用于对数据库进行查询的情况下,该方法具体包括:
[0050]步骤SlOl,获取客户端发送的SQL语句。
[0051]在步骤SlOl中,SQL (Structured Query Language,结构化查询语言)是一种对数据库查询的语句。可以通过JAVA API (Applicat1n Programming Interface,应用程序编程接口)或者Restful WebService API接口获取客户端发送的SQL语句,以对数据库进行查询。
[0052]步骤S102,解析SQL语句,获得语法分析树。
[0053]在步骤S102中,可以使用内部算法对SQL语句进行解析,分析SQL语句的语法,获得语法分析树。
[0054]例如,SQL语句为:【SELECT title FROM starsin Where starname in (SELECTname from moviestarwhere birthday like ‘ 1960’)】解析该 SQL 语句获得的语法分析树形式如图2所示。
[0055]在图2中,非终结符和终结符包括:〈Attribute>属性、〈Relat1n〉关系、〈pattern〉模式和〈Tuple〉元组。语法分析树中存在两个〈Relat1n〉:starsin (明星范围)和moviestar (电影明星)。starsin、moviestar是由非终结符〈Relat1n〉本身定义的。同样〈Attribute〉也是由本身定义的。starsin的属性包括title (标题)和starname (明星名),moviestar的属性包括:name (姓名)和birthday (生日),都是通过所代表的规则来定义的语法类,其最终的终结符所代表的就是数据库的元数据。
[0056]步骤S103,依据语法分析树从SQL语句中提取规范的SQL语句。
[0057]规范的SQL语句可以为语法分析树的叶子节点对应的SQL语句。
[0058]不同的SQL语句可能会具有相同的语法分析树的叶子节点,例如,第一 SQL语句为“A = 1,B = 2,查询A是否大于B”;第二 SQL语句为“A = 2,B = 1,查询A是否大于B”,这两个SQL语句具有相同的查询结果,也具有相同的语法分析树的叶子节点。因此,可以解析这两条语句中的任意一条SQL语句,获得语法分析树,将语法分析树的叶子节点作为这两条语句的规范的SQL语句。
[0059]步骤S104,判断所述SQL语句是否符合预设的规则。
[0060]在步骤S104中,判断SQL语句是否符合预设的规则,若符合,执行步骤S105 ;若不符合,则将SQL语句返回至客户端。
[0061]预设的规则可以包括以下至少一项:SQL语句拼写正确;SQL语句为SELECT语句;如无需动态更新缓存,SQL语句支持count、max、min、avg和sum类型的聚合函数;如需要支持动态更新缓存,SQL语句不支持avg类型的聚合函数;SQL语句不支持的表名列表和黑名单制;SQL语句不支持包括具有group by和having关键词的语句;SQL语句不包括超过一级以上子查询。
[0062]步骤S105,判断中间结果表中是否缓存有与规范的SQL语句对应的查询结果,若有,则将查询结果发送至客户端;若无,则查询规范SQL语句,获得查询结果,并执行步骤S106o
[0063]在步骤S105中,为提高查询速度,中间结果表可以是内存散列表,如果内存的使用量在预设的容量范围,例如60%之内,则将查询结果放入内存进行缓存;若内存的使用量超过60%,则内存中保存中间结果表的索引位置。同时为了避免一些偶尔调用的SQL语句的查询结果缓存在内存中,造成内存资源浪费,可以在预设的访问总数或者访问频率的阈值,当SQL语句的访问总数或者访问频率超过预设的访问总数或者访问频率的阈值时,在内存中缓存该SQL语句的查询结果。
[0064]步骤S106,将查询结果缓存到中间结果表中。
[0065]在步骤S106中,如果查询结果过多内存无法存放,则使用二级缓存结构,将查询结果缓存到数据库统计表的入口地址。
[0066]通
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1