本发明涉及数据库技术,特别是涉及一种数据处理方法、存储介质与设备。
背景技术:
1、数据库执行一个sql的过程一般分为词法分析、语法分析、语义分析、查询重写、生成执行计划、实际执行这几个阶段。其中,词法分析、语法分析、语义分析、查询重写这些阶段的最终目的是为了生成执行计划,而生成执行计划是为了高效地执行sql并返回结果。当大量的数据库连接存在并且数据库的访问压力比较大时,以上sql的执行过程会竞争共享资源,从而造成数据库的性能下降。实际上,对于某些格式基本类似的sql来说,其从词法分析到生成执行计划阶段的执行过程以及中间产物完全相同。因此,对于这类sql无需每次执行都重复执行相同的过程,而只需要把执行计划缓存起来。例如,对两个sql:select*froma where id<1,select*form a where id<10,这两个sql的执行结果不同,但执行计划可以是相同的。对于这类sql语句,我们可以把其执行计划缓存起来,下次处理同类的sql请求时,我们只需要读取缓存的执行计划,就可以避免执行语法分析、语义分析、查询重写、生成执行计划这些阶段的工作,从而提高系统的性能。
2、目前有些数据库系统实现了执行计划的缓存。对sql的过程中,会把sql的执行计划缓存起来,到下一次执行相同的sql时,直接从缓存中读取执行计划从而执行。例如,oracle会把执行计划缓存在共享内存中,kes数据库会把执行计划缓存在本地内存中。
3、然而,对于sql中带有like操作的sql,一部分可以将like操作变为比较操作,另一部分不可以将like操作变为比较操作。例如,对于sql:select*from a where name like‘a%’,可以转变为where name>=‘a’and name<‘b’,以将like操作变为比较操作,从而在执行计划中使用缓存。但是当sql语句中带有参数时,例如where name like$1,则无法转化为比较操作,故其在缓存中的执行计划仅可以使用全表扫描,而不可使用索引扫描。目前的数据库系统会将带有like操作的sql均归为一类sql,并将其执行计划缓存起来。考虑到该类sql中的部分sql只能使用全表扫描,该类sql缓存的执行计划也只能为全表扫描,不能使用索引扫描,这会导致全部带有like操作的sql均执行全表扫描,sql语句的执行效率低,从而影响了数据库的性能。
技术实现思路
1、鉴于上述问题,提出了一种克服上述问题或者至少部分地解决上述问题的数据处理方法、存储介质与设备。
2、本发明的一个目的是要提供一种数据处理方法,以提高sql的执行效率。
3、本发明一个进一步的目的是要提高在接收带有like操作的sql请求之后确定执行计划的准确性。
4、特别地,本发明提供了一种数据处理方法,包括:
5、在收到带有like操作的sql语句的情况下,生成并缓存与带有like操作的sql语句对应的两个执行计划,两个执行计划包括访问类型为全表扫描的第一执行计划和访问类型为索引扫描的第二执行计划;
6、在接收带有like操作的sql请求之后,判断带有like操作的sql请求中的like操作是否可以转化为比较操作;
7、若是,则执行第二执行计划。
8、可选地,判断带有like操作的sql请求中的like操作是否可以转化为比较操作包括:
9、获取带有like操作的sql请求中的like之后的常量;
10、根据常量,判断like操作中的like运算符是否可以转换为比较运算符;
11、若可以,则确定带有like操作的sql请求中的like操作可以转化为比较操作;
12、若不可以,则确定带有like操作的sql请求中的like操作不可以转化为比较操作。
13、可选地,根据常量,判断like操作中的like运算符是否可以转换为比较运算符包括:
14、判断常量中是否存在前置的通配符;
15、若存在,则确定like操作中的like运算符不可以转换为比较运算符;
16、若不存在,则确定like操作中的like运算符可以转换为比较运算符。
17、可选地,判断常量中是否存在前置的通配符包括:
18、判断常量的第一位是否为通配符;
19、若是,则确定常量中存在前置的通配符;
20、若否,则确定常量中不存在前置的通配符。
21、可选地,在收到带有like操作的sql语句的情况下,生成并缓存与带有like操作的sql语句对应的两个执行计划包括:
22、在收到带有like操作的sql语句的情况下,进行词法分析,将带有like操作的sql语句中的常量替换为参数;
23、根据替换后的带有like操作的sql语句生成两个执行计划;
24、将两个执行计划放入相同的执行计划缓存中。
25、可选地,在接收带有like操作的sql请求之后,在判断带有like操作的sql请求中的like操作是否可以转化为比较操作的步骤之前,数据处理方法还包括:
26、进行词法分析,将带有like操作的sql请求中的常量替换为参数;
27、查询执行计划缓存中的执行计划,得到两个执行计划。
28、可选地,根据替换后的带有like操作的sql语句生成两个执行计划包括:
29、拷贝带有like操作的sql语句,并将拷贝得到的带有like操作的sql语句中的like操作转化为比较操作;
30、分别生成第一执行计划和第二执行计划,其中,第一执行计划与带有like操作的sql语句对应,第二执行计划与转化得到的带有比较操作的sql语句对应。
31、可选地,在判断带有like操作的sql请求中的like操作是否可以转化为比较操作的步骤之后,数据处理方法还包括:
32、在确定带有like操作的sql请求中的like操作不可以转化为比较操作的情况下,执行第一执行计划。
33、根据本发明的另一个方面,还提供了一种机器可读存储介质,其上存储有机器可执行程序,机器可执行程序被处理器执行时实现上述任一种的数据处理方法。
34、根据本发明的又一个方面,还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并在处理器上运行的机器可执行程序,并且处理器执行机器可执行程序时实现上述任一种的数据处理方法。
35、本发明的数据处理方法,通过在收到带有like操作的sql语句的情况下,生成并缓存与带有like操作的sql语句对应的两个执行计划,两个执行计划包括访问类型为全表扫描的第一执行计划和访问类型为索引扫描的第二执行计划,实现了对带有like操作的sql语句缓存带有索引扫描和不带索引扫描的两个执行计划,并通过在接收带有like操作的sql请求之后,判断带有like操作的sql请求中的like操作是否可以转化为比较操作,并在确定带有like操作的sql请求中的like操作可以转化为比较操作的情况下,执行第二执行计划,实现了执行计划的选择确定,避免了全部带有like操作的sql均仅能执行全表扫描导致的sql执行效率低的问题,提高了sql的执行效率,从而提高了数据库系统的整体性能。
36、进一步地,本发明的数据处理方法通过获取带有like操作的sql请求中的like之后的常量,并根据常量判断like操作中的like运算符是否可以转换为比较运算符,在like运算符可以转换为比较运算符的情况下,确定带有like操作的sql请求中的like操作可以转化为比较操作,并在like运算符不可以转换为比较运算符的情况下确定带有like操作的sql请求中的like操作不可以转化为比较操作,从而实现了对于带有like操作的sql请求中的like操作是否可以转化为比较操作的准确判断,从而提高了在接收带有like操作的sql请求之后选择确定执行计划的准确性,进一步保证了sql的执行效率。
37、根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述以及其他目的、优点和特征。