本发明涉及数据库,尤其涉及一种opengauss数据库中基于结果集查询缓存的查询方法。
背景技术:
1、一个查询语句从执行到将结果集返回到客户端,需要经过解析、计划、执行等复杂的处理过程。对于使用大量数据进行复杂运算的查询语句,它们的执行时间受到系统的io读写、数据库计算、网络传输通信等各种因素影响,导致很难在较短的时间内完成整个处理流程并返回结果。在实际业务场景中,通常使用类似redis的内存数据结构存储系统作为业务系统与数据库之间的中间件来减轻业务系统对数据库的压力,提升业务响应速度。但是由于复杂业务场景中涉及到大量计算的查询语句,即使使用了部分中间件来减轻数据库的负载,但是在高并发的场景下,仍然会大量的查询语句需要被数据库处理。
2、当一个查询语句使用的数据量越大,使用的复杂函数就越多,连接条件也越复杂,因此其需要的执行时间就更长,若相同查询语句多次访问的数据库实例以及其访问的所有实际数据在多次查询中并未改变,且查询的结果集因为数据没有变更不会产生变化,那么在非首次查询后的每一次查询若无需进行重复的扫描磁盘、计算等操作,将节省时间。
3、目前opengauss中已经实现了共享缓冲区(shared buffers),共享缓冲区是一种内存缓存机制,用于存储数据库中经常访问的数据块,这些数据块是以实际文件在内存中的等价映射映射存在的,查询中使用共享缓冲区可以减少一部分的访盘操作,但是并不能减少对于这些数据的计算,且并不能保证一次查询所需要访问的所有数据都已经存放在共享缓冲区。
4、结果集缓存可以避免数据库重复数据对相同的查询语句多次计算,从而减少数据库的负载和响应时间。当数据库中的数据发生变化时,查询缓存会自动失效,从而保证查询结果的正确性。但是opengauss中不支持对于查询结果集的缓存。
5、因此,如何将结果集缓存兼容应用于opengauss中,提高opengauss数据库的查询效率,成为亟待解决的技术问题。
技术实现思路
1、有鉴于此,为了克服现有技术的不足,本发明旨在提供一种opengauss数据库中基于结果集查询缓存的查询方法。
2、一方面,本发明提供一种opengauss数据库中基于结果集查询缓存的查询方法,包括:
3、对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存;
4、计算能够启用结果集查询缓存的查询语句的哈希值,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录;
5、当查询语句的哈希值命中缓存哈希表中的缓存记录,判断所述命中的缓存记录在当前时间节点是否可用,将在当前时间节点可用的缓存记录返回至发起查询的客户端;
6、当所述哈希值没有命中缓存哈希表中的缓存记录,在查询执行时同步新建初始化缓存,并向初始化缓存中填充缓存内容,将生效的缓存加入结果集查询缓存中。
7、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存,包括:
8、当查询语句的类型为ddl或dml,将所述查询语句判定为不能启用结果集查询缓存;
9、当查询语句的类型为dql,判断所述查询语句是否满足结果集查询缓存的约束,当所述查询语句满足结果集查询缓存的约束,将所述查询语句判定为能够启用结果集查询缓存。
10、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,当查询语句的类型为ddl或dml,将所述查询语句判定为不能启用结果集查询缓存,包括:
11、判断类型为ddl或dml的查询语句是否对查询结果的准确性有影响,当类型为ddl或dml的查询语句对查询结果的准确性有影响,在对所述查询语句进行语义分析时,记录所述查询语句使用的表oid,在查询执行时对缓存哈希表中依赖所述表oid的缓存记录进行失效,从存储引擎获取查询数据返回至发起查询的客户端;
12、当类型为ddl或dml的查询语句对查询结果的准确性没有影响,从存储引擎获取查询数据返回至发起查询的客户端。
13、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,计算能够启用结果集查询缓存的查询语句的哈希值,包括:通过获取能够启用结果集查询缓存的查询语句的查询树关键结构,从查询树关键结构中提取查询树的节点信息,根据提取的节点信息生成字符序列,计算所述字符序列的哈希值。
14、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录,包括:
15、将缓存哈希表分为若干个哈希桶,根据哈希桶的数量对查询语句的哈希值进行取模,在哈希桶内对取模后的哈希值进行匹配;
16、当查询语句的哈希值与缓存哈希表中的缓存记录相匹配时,将所述查询语句的哈希值判定为命中缓存哈希表中的缓存记录;
17、当查询语句的哈希值与缓存哈希表中的缓存记录不匹配时,将所述查询语句的哈希值判定为未命中缓存哈希表中的缓存记录。
18、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,当查询语句的哈希值与缓存哈希表中的缓存记录相匹配时,将所述查询语句的哈希值判定为命中缓存哈希表中的缓存记录,包括:通过比较查询语句的查询树结构与哈希表的缓存记录中的查询树结构是否相同,验证所述查询语句与哈希表中的缓存记录是否属于相同的查询。
19、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,当查询语句的哈希值命中缓存哈希表中的缓存记录,判断所述命中的缓存记录在当前时间节点是否可用,将在当前时间节点可用的缓存记录返回至发起查询的客户端,包括:
20、当所述命中的缓存记录在当前时间节点可用时,采用缓存执行节点将所述缓存记录转化为查询执行器可识别的tuple结构;
21、当所述命中的缓存记录在当前时间节点不可用时,从存储引擎获取查询数据返回至发起查询的客户端。
22、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,当所述哈希值没有命中缓存哈希表中的缓存记录,在查询执行时同步新建初始化缓存,并向初始化缓存中填充缓存内容,将生效的缓存加入结果集查询缓存中,包括:
23、通过占位操作生成缓存记录,在缓存哈希表中持有初始化状态的缓存记录;
24、在查询语句执行过程中,持续将每次的查询结果以元组的格式填充至初始化状态的缓存记录对应的结果集中,当将查询结果填充至所述结果集的过程中,发生了使缓存失效的操作时,终止所述填充过程,并使查询执行器的上下文放弃持有所述缓存记录;
25、在查询语句执行完成时,再次判断所有填充过程中是否发生了使缓存失效的操作,当未发生使缓存失效的操作,将经过填充的初始化状态的缓存记录的状态更新为生效。
26、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,通过占位操作生成缓存记录,在缓存哈希表中持有初始化状态的缓存记录,包括:为每个缓存设置一个引用计数,在查询重写阶段后进行占位操作,通过对查询命中的哈希桶加写锁进行内存拷贝,在全局缓存中生成一个以初始化状态被缓存哈希表持有的缓存记录,并将所述缓存的引用计数更新。
27、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,状态为生效的缓存记录包括缓存关键信息,所述缓存关键信息包括缓存记录id、查询树完整结构、查询树哈希值以及以元组形式存储的结果集。
28、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法,还包括:对结果集查询缓存进行失效处理。
29、优选地,本发明opengauss数据库中基于结果集查询缓存的查询方法中,对结果集查询缓存进行失效处理,包括:
30、当缓存的某条或者全部记录不被需要时,通过函数接口指定失效的缓存记录id,在辅助信息缓存中匹配到对应的查询语句的哈希值,使用哈希值和缓存记录id对哈希表中的某个缓存记录匹配,并减少其引用计数的值,通过手动失效的方式将其从缓存中删除;
31、当缓存中的数据过期或者表结构发生改变,导致缓存中的结果集已经和实际应该查询出的结果不符合,在响应某些对查询结果的准确性有影响的ddl或者dml语句操作时触发自动失效操作,当所述语句所在的事务处于提交过程中,并且在事务真正提交之前的时刻对事务中的所有语句引用的表的oid涉及到的缓存记录进行失效操作;
32、当缓存空间不足时,通过将缓存的引用计数设置为初始值,自动删除缓存中的对应数据。
33、最后,本发明还提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现上述opengauss数据库中基于结果集查询缓存的查询方法。
34、本发明的opengauss数据库中基于结果集查询缓存的查询方法,可以减少对相同的语句的重复计算,当语句访问的表的实际数据没有改变时,直接应用缓存中存储的结果集查询缓存,省去了访问磁盘、计算的时间;同时,结果集查询缓存为实例级别,支持多个会话访问同一个结果内容且支持opengauss的扩展查询协议;从而可以大幅提高数据库的平均响应时间。尤其适用于并发查询数目多、要求数据库的每秒钟处理的请求数量(qps)高的业务场景。