一种openGauss数据库中基于结果集查询缓存的查询方法技术

技术编号:38531136 阅读:11 留言:0更新日期:2023-08-19 17:04
本发明专利技术涉及数据库技术领域,提供一种openGauss数据库中基于结果集查询缓存的查询方法,包括:对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存;计算能够启用结果集查询缓存的查询语句的哈希值,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录;当查询语句的哈希值命中缓存哈希表中的缓存记录,判断所述命中的缓存记录在当前时间节点是否可用,将在当前时间节点可用的缓存记录返回至发起查询的客户端;当所述哈希值没有命中缓存哈希表中的缓存记录,在查询执行时同步新建初始化缓存,并向初始化缓存中填充缓存内容,将生效的缓存加入结果集查询缓存中。本发明专利技术可减少相同语句的重复计算,提高数据库的平均响应时间。提高数据库的平均响应时间。提高数据库的平均响应时间。

【技术实现步骤摘要】
一种openGauss数据库中基于结果集查询缓存的查询方法


[0001]本专利技术涉及数据库
,尤其涉及一种openGauss数据库中基于结果集查询缓存的查询方法。

技术介绍

[0002]一个查询语句从执行到将结果集返回到客户端,需要经过解析、计划、执行等复杂的处理过程。对于使用大量数据进行复杂运算的查询语句,它们的执行时间受到系统的IO读写、数据库计算、网络传输通信等各种因素影响,导致很难在较短的时间内完成整个处理流程并返回结果。在实际业务场景中,通常使用类似Redis的内存数据结构存储系统作为业务系统与数据库之间的中间件来减轻业务系统对数据库的压力,提升业务响应速度。但是由于复杂业务场景中涉及到大量计算的查询语句,即使使用了部分中间件来减轻数据库的负载,但是在高并发的场景下,仍然会大量的查询语句需要被数据库处理。
[0003]当一个查询语句使用的数据量越大,使用的复杂函数就越多,连接条件也越复杂,因此其需要的执行时间就更长,若相同查询语句多次访问的数据库实例以及其访问的所有实际数据在多次查询中并未改变,且查询的结果集因为数据没有变更不会产生变化,那么在非首次查询后的每一次查询若无需进行重复的扫描磁盘、计算等操作,将节省时间。
[0004]目前openGauss中已经实现了共享缓冲区(Shared Buffers),共享缓冲区是一种内存缓存机制,用于存储数据库中经常访问的数据块,这些数据块是以实际文件在内存中的等价映射映射存在的,查询中使用共享缓冲区可以减少一部分的访盘操作,但是并不能减少对于这些数据的计算,且并不能保证一次查询所需要访问的所有数据都已经存放在共享缓冲区。
[0005]结果集缓存可以避免数据库重复数据对相同的查询语句多次计算,从而减少数据库的负载和响应时间。当数据库中的数据发生变化时,查询缓存会自动失效,从而保证查询结果的正确性。但是openGauss中不支持对于查询结果集的缓存。
[0006]因此,如何将结果集缓存兼容应用于openGauss中,提高openGauss数据库的查询效率,成为亟待解决的技术问题。

技术实现思路

[0007]有鉴于此,为了克服现有技术的不足,本专利技术旨在提供一种openGauss数据库中基于结果集查询缓存的查询方法。
[0008]一方面,本专利技术提供一种openGauss数据库中基于结果集查询缓存的查询方法,包括:
[0009]对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存;
[0010]计算能够启用结果集查询缓存的查询语句的哈希值,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录;
[0011]当查询语句的哈希值命中缓存哈希表中的缓存记录,判断所述命中的缓存记录在当前时间节点是否可用,将在当前时间节点可用的缓存记录返回至发起查询的客户端;
[0012]当所述哈希值没有命中缓存哈希表中的缓存记录,在查询执行时同步新建初始化缓存,并向初始化缓存中填充缓存内容,将生效的缓存加入结果集查询缓存中。
[0013]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存,包括:
[0014]当查询语句的类型为DDL或DML,将所述查询语句判定为不能启用结果集查询缓存;
[0015]当查询语句的类型为DQL,判断所述查询语句是否满足结果集查询缓存的约束,当所述查询语句满足结果集查询缓存的约束,将所述查询语句判定为能够启用结果集查询缓存。
[0016]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,当查询语句的类型为DDL或DML,将所述查询语句判定为不能启用结果集查询缓存,包括:
[0017]判断类型为DDL或DML的查询语句是否对查询结果的准确性有影响,当类型为DDL或DML的查询语句对查询结果的准确性有影响,在对所述查询语句进行语义分析时,记录所述查询语句使用的表OID,在查询执行时对缓存哈希表中依赖所述表OID的缓存记录进行失效,从存储引擎获取查询数据返回至发起查询的客户端;
[0018]当类型为DDL或DML的查询语句对查询结果的准确性没有影响,从存储引擎获取查询数据返回至发起查询的客户端。
[0019]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,计算能够启用结果集查询缓存的查询语句的哈希值,包括:通过获取能够启用结果集查询缓存的查询语句的查询树关键结构,从查询树关键结构中提取查询树的节点信息,根据提取的节点信息生成字符序列,计算所述字符序列的哈希值。
[0020]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录,包括:
[0021]将缓存哈希表分为若干个哈希桶,根据哈希桶的数量对查询语句的哈希值进行取模,在哈希桶内对取模后的哈希值进行匹配;
[0022]当查询语句的哈希值与缓存哈希表中的缓存记录相匹配时,将所述查询语句的哈希值判定为命中缓存哈希表中的缓存记录;
[0023]当查询语句的哈希值与缓存哈希表中的缓存记录不匹配时,将所述查询语句的哈希值判定为未命中缓存哈希表中的缓存记录。
[0024]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,当查询语句的哈希值与缓存哈希表中的缓存记录相匹配时,将所述查询语句的哈希值判定为命中缓存哈希表中的缓存记录,包括:通过比较查询语句的查询树结构与哈希表的缓存记录中的查询树结构是否相同,验证所述查询语句与哈希表中的缓存记录是否属于相同的查询。
[0025]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,当查询语句的哈希值命中缓存哈希表中的缓存记录,判断所述命中的缓存记录在当前时间节点是否可用,将在当前时间节点可用的缓存记录返回至发起查询的客户端,包括:
[0026]当所述命中的缓存记录在当前时间节点可用时,采用缓存执行节点将所述缓存记
录转化为查询执行器可识别的TUPLE结构;
[0027]当所述命中的缓存记录在当前时间节点不可用时,从存储引擎获取查询数据返回至发起查询的客户端。
[0028]优选地,本专利技术openGauss数据库中基于结果集查询缓存的查询方法中,当所述哈希值没有命中缓存哈希表中的缓存记录,在查询执行时同步新建初始化缓存,并向初始化缓存中填充缓存内容,将生效的缓存加入结果集查询缓存中,包括:
[0029]通过占位操作生成缓存记录,在缓存哈希表中持有初始化状态的缓存记录;
[0030]在查询语句执行过程中,持续将每次的查询结果以元组的格式填充至初始化状态的缓存记录对应的结果集中,当将查询结果填充至所述结果集的过程中,发生了使缓存失效的操作时,终止所述填充过程,并使查询执行器的上下文放弃持有所述缓存记录;
[0031]在查本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种openGauss数据库中基于结果集查询缓存的查询方法,其特征在于,所述方法包括:对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存;计算能够启用结果集查询缓存的查询语句的哈希值,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录;当查询语句的哈希值命中缓存哈希表中的缓存记录,判断所述命中的缓存记录在当前时间节点是否可用,将在当前时间节点可用的缓存记录返回至发起查询的客户端;当所述哈希值没有命中缓存哈希表中的缓存记录,在查询执行时同步新建初始化缓存,并向初始化缓存中填充缓存内容,将生效的缓存加入结果集查询缓存中。2.根据权利要求1所述的openGauss数据库中基于结果集查询缓存的查询方法,其特征在于,对查询语句进行语义分析,根据查询语句的类型判断是否能够启用结果集查询缓存,包括:当查询语句的类型为DDL或DML,将所述查询语句判定为不能启用结果集查询缓存;当查询语句的类型为DQL,判断所述查询语句是否满足结果集查询缓存的约束,当所述查询语句满足结果集查询缓存的约束,将所述查询语句判定为能够启用结果集查询缓存。3.根据权利要求2所述的openGauss数据库中基于结果集查询缓存的查询方法,其特征在于,当查询语句的类型为DDL或DML,将所述查询语句判定为不能启用结果集查询缓存,包括:判断类型为DDL或DML的查询语句是否对查询结果的准确性有影响,当类型为DDL或DML的查询语句对查询结果的准确性有影响,在对所述查询语句进行语义分析时,记录所述查询语句使用的表OID,在查询执行时对缓存哈希表中依赖所述表OID的缓存记录进行失效,从存储引擎获取查询数据返回至发起查询的客户端;当类型为DDL或DML的查询语句对查询结果的准确性没有影响,从存储引擎获取查询数据返回至发起查询的客户端。4.根据权利要求1所述的openGauss数据库中基于结果集查询缓存的查询方法,其特征在于,计算能够启用结果集查询缓存的查询语句的哈希值,包括:通过获取能够启用结果集查询缓存的查询语句的查询树关键结构,从查询树关键结构中提取查询树的节点信息,根据提取的节点信息生成字符序列,计算所述字符序列的哈希值。5.根据权利要求1所述的openGauss数据库中基于结果集查询缓存的查询方法,其特征在于,判断所述查询语句的哈希值是否命中缓存哈希表中的缓存记录,包括:将缓存哈希表分为若干个哈希桶,根据哈希桶的数量对查询语句的哈希值进行取模,在哈希桶内对取模后的哈希值进行匹配;当查询语句的哈希值与缓存哈希表中的缓存记录相匹配时,将所述查询语句的哈希值判定为命中缓存哈希表中的缓存记录;当查询语句的哈希值与缓存哈希表中的缓存记录不匹配时,将所述查询语句的哈希值判定为未命中缓存哈希表中的缓存记录。6.根据权利要求5所述的openGauss数据库中基于结果集查询缓存的查询方法,其特征在于,当查询语句的哈希值与缓存哈希表中的缓存记录相匹配时,将所述查询语句的哈希值判定为命中缓存哈希表中的缓存记录,包括:通过比较查询语句的查询树结构与哈希表
的缓存记录中的查询树结构是否相同,验证所述查询语句与哈希表中的缓存记录是否属于相同的查询。7.根据权利要求1所述的openGauss数据库中基于结果集查询缓存的查询方法...

【专利技术属性】
技术研发人员:蒲境瑞陈炳达
申请(专利权)人:广州海量数据库技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1