CN104750727A - 一种列式内存存储查询装置及列式内存存储查询方法 - Google Patents

一种列式内存存储查询装置及列式内存存储查询方法 Download PDF

Info

Publication number
CN104750727A
CN104750727A CN201310744231.9A CN201310744231A CN104750727A CN 104750727 A CN104750727 A CN 104750727A CN 201310744231 A CN201310744231 A CN 201310744231A CN 104750727 A CN104750727 A CN 104750727A
Authority
CN
China
Prior art keywords
data
cascade
querying condition
column
column data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201310744231.9A
Other languages
English (en)
Other versions
CN104750727B (zh
Inventor
杜海亮
陈晓峰
贲福才
户顺义
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Bright Oceans Inter Telecom Co Ltd
Original Assignee
Bright Oceans Inter Telecom Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Bright Oceans Inter Telecom Co Ltd filed Critical Bright Oceans Inter Telecom Co Ltd
Priority to CN201310744231.9A priority Critical patent/CN104750727B/zh
Publication of CN104750727A publication Critical patent/CN104750727A/zh
Application granted granted Critical
Publication of CN104750727B publication Critical patent/CN104750727B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开一种列式内存存储查询装置,其特征在于,所述装置包括:内存存储单元,用于在内存中创建列数组存储行式存储结构中的各列数据;数据装载单元,用于将所述行式存储结构中的目标列数据装载入所述内存存储单元;查询引擎,用于根据数据消费者输入的级联查询条件,对所述数据装载单元装载入所述内存存储单元的列数据进行查询,获取满足所述级联查询条件的列数据位置标识,发送给行读取单元;行读取单元,根据所述查询引擎获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。通过本发明可实现内存中的简单存储,和高效查询。本发明还提供一种列式内存存储查询方法。

Description

一种列式内存存储查询装置及列式内存存储查询方法
技术领域
本发明数据存储领域,具体地涉及一种列式内存存储查询装置和方法。
背景技术
随着互联网的飞速发展,各种业务数据量也急剧增加,对于数据的存储方式直接影响数据查询的效率,而数据查询的效率又会直接影响各种业务的处理效率,科学的进行数据存储,保证数据的高效读写,是提高业务处理效率的基础。
内存中采用什么样的数据结构进行存储,对内存占用及运算效率具有重要的意义,由于内存资源有限,要以占用资源较小的方式进行存储,首先应回答的是多小才算小,一个int在内存中占用4个字节,N个int就应该最小接近4*N,这样的内存消耗可以认为是小的,如果比这个还要小,只能是采用压缩和特殊编码方式,而压缩和编码必然会在运算时进行解压缩和解密的过程,这个必然会影响效率,所以内存表除了特殊的情况,应该采用原文存储,避免不必要的运算消耗。
目前的各种存储方法,最常用的是按行存储,每行的存储单元具有相同的数据结构,一行上要支持存储多列的多数据类型数据,大部分的应用在***数据和取数据时均是以行为单位,所以绝大部分的数据均是按行存储的,然而查询往往是在列上发生,查询时需要遍历每一行取到每一行的行对象指针,再由行对象指针取到相应列的值,如果采用通用结构可能按照列的index或名称进行索引取值,去之后对每个列对象单元格进行比对和查找,判断是否为选定的行,如果是把行指针放到结果队列。这种执行一次取值任务,需要在每行中寻找值以及对每行进行类型转换或值比对,会占用大量内存资源,降低查询取值的效率。
现有技术内存数据存储大都是采用对象行式存储和复杂的数据结构存储,运算效率不高,占用大量内存资源;还有一种思路是采用内存数据库进行存储,但同样消耗大量内存,性能依赖于索引,使用的接口较为复杂,采用SQL表达式和解析器解析查询。这些技术的特点注定了其查询效率和加载效率不高,条件灵活性不强,具有较为复杂的API,不适合使用在针对内存中高效查询的应用场景。
因此需要一种在内存中支持高速高效查询的存储查询方式。
发明内容
本发明提供了一种列式内存存储查询装置,其特征在于,所述装置包括:
内存存储单元,用于在内存中创建列数组存储行式存储结构中的各列数据;
数据装载单元,用于将所述行式存储结构中的目标列数据装载入所述内存存储单元;
查询引擎,用于根据数据消费者输入的级联查询条件,对所述数据装载单元装载入所述内存存储单元的列数据进行查询,获取满足所述级联查询条件的列数据位置标识,发送给行读取单元;
行读取单元,根据所述查询引擎获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
优选的,所述装置还包括:
缓存单元,用于存储所述查询引擎的查询数据,当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化时,将所述存储的满足所述级联查询条件的列数据位置标识发送给行读取单元;
周期控制单元,用于为所述内存存储单元设定内存存储周期,删除数组中超出所述内存存储周期的列数据,还用于为所述缓存单元设定缓存周期,删除缓存单元中超出所述缓存周期的缓存数据;
锁定控制单元,用于对所述内存存储单元设定读锁和写锁,控制所述内存存储单元的读写锁定和解锁。
详细的,所述内存存储单元进一步包括:
列数据存储模块,用于创建列数组存储不同列的列数据,以所述列数组在行式存储结构中相应列的字段名称命名该列数组,所述数组下标为列数据位置标识;
数据表存储模块,用于创建数据表,将所述列数据存储模块存储的属于相同行式存储结构的列数组存入相同的数据表;
所述内存存储单元可包含多个数据表存储模块,每个数据表存储模块可包含多个列数据存储模块,每个所述列数据存储模块保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同;
优先使用简单类型将所述列数据存入列数据存储模块。
优选的,为每个所述数据表存储模块中保存的数据表设置版本号,当所述数据表对应的所述行式存储结构数据发生变化时,更新所述版本号。
具体的,所述查询引擎进一步包括:
规则定义存储模块,用于定义并存储所述级联查询条件的解析规则;
级联查询条件解析模块,用于接收数据消费者输入的级联查询条件,根据所述规则定义存储模块定义的所述级联查询条件的解析规则,解析所述级联查询条件;
查询模块,根据所述级联查询条件解析模块解析获得的级联查询条件,逐级对所述列数据存储模块存储的列数组进行查询,获取满足所述级联查询条件的列数据位置标识。
具体的,所述缓存单元进一步包括:
查询数据存储模块,用于存储级联查询条件,该级联查询条件所针对的数据表版本信息和查询获取的列数据位置标识;
一致性检验模块,用于检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致,以及检验数据消费者要求查询的数据表版本信息与存储的数据表版本信息是否一致;
查询结果发送模块,用于当一致性判断模型的判断结果为一致时,将所述查询数据存储模块存储的与该级联查询条件对应的列数据位置标识发送给所述行读取单元。
更具体的,所述一致性检验模块进一步包括:
级联查询条件检验模块,用于根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致;
目标数据检验模块,用于检验数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息是否一致。
本发明还公开一种列式内存存储查询方法,所述方法包括:
在内存中创建列数组存储行式存储结构中的各列数据;
将所述行式存储结构中的列数据装载入所述创建的列数组;
根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识;
根据所述获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
优选的,所述方法还包括:
将一次查询使用的级联查询条件、针对的列数组、获取列数据位置标识存入缓存,当数据消费者输入的所述级联查询条件与存储的级联查询条件相同,且该级联查询条件对应的列数组未发生变化时,根据所述存储的满足所述级联查询条件的列数据位置标识,获取行号与所述列数据位置标识一致的所有行数据信息;
设定内存存储周期,删除列数组中超出所述内存存储周期的列数据;
设定缓存周期,删除缓存中超出所述缓存周期的数据;
设定读锁和写锁,控制对所述列数组的读写锁定和解锁。
详细的,所述在内存中创建列数组存储行式存储结构中的各列数据的方法具体为:
创建列数组存储不同列的列数据,以所述列数据在行式存储结构中相应列的字段名称命名该列数组,所述列数组下标为列数据位置标识;
创建数据表,将属于相同行式存储结构的所述列数组存入相同的数据表;
可创建多个所述数据表,每个数据表包含多个所述列数组,每个所述列数组保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同;
优先使用简单类型将列数据存入列数据存储模块。
优选的,存储每个所述数据表的版本号信息,当所述数据表中的列数据发生变化时,更新所述版本号信息。
详细的,所述根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识的方法具体为:
定义并存储所述级联查询条件的解析规则;
接收数据消费者输入的级联查询条件,根据所述存储的级联查询条件解析规则,解析所述级联查询条件;
根据所述解析后的级联查询条件,逐级对所述列数组中存储的数据进行查询,获取满足所述级联查询条件的列数据位置标识。
更详细的,所述判定当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化的方法具体为:
根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致;
若数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息一致,则判定该级联查询条件对应的列数组未发生变化。
本发明通过将行式存储结构中的数据装载入内存,以列数组的方式进行存储,查询符合条件的数据,并获取该数据的列数据位置标识(即数据所在数组位置的下标),通过该标识获取符合查询条件的行号,进而获取整行数据,这样做的好处是,在查询时不需要遍历每一行取每一行的信息后,对目标列进行比较计算,而是直接针对行存储结构中的该列所有数据,将其放入数组中进行统一比对,获得满足条件的行号,再获取满足条件的行数据,大大节约了遍历和对每行均进行取值比较计算的时间,提升了查询的效率;同时本发明提供级联查询条件供数据消费者自由编辑,通过逐级查询逐步缩小查询范围,进一步提高查询效率;优选的,本发明还提供缓存,用于保存以往查询的状态信息和结果信息,当下一次级联查询条件到来时,如果查询条件、目标列数组均未发生变化,则直接根据存储的查询列数组位置标识读取行信息发送给数据消费者,进一步提高了查询效率,综上所述,本发明提供了一种支持高速高效查询的列式内存存储查询方式。
附图说明
图1为本发明实施例一一种列式内存存储查询装置的结构示意图;
图2为本发明实施例二装置的结构示意图;
图3为本发明实施例三结合实例的一种列式内存存储查询装置工作流程示意图;
图4为本发明实施例四一种列式内存存储查询方法的方法流程图;
图5为本发明实施例五方法的方法流程图;
图6为本发明实施例六如何解析级联查询条件并进行一致性判断的方法流程图;
图7为本发明实施例六中进行级联查询层次示意图。
具体实施方式
以下将配合图式及实施例来详细说明本发明的实施方式,藉此对本发明如何应用技术手段来解决技术问题并达成技术功效的实现过程能充分理解并据以实施。
如图1所示,本发明实施例一公开一种列式内存存储查询装置,包括以下结构:
内存存储单元1,用于在内存中创建列数组存储行式存储结构中的各列数据。
由于内存资源空间有限,采用简单的数组存储各列数据。数组结构仅有下标和值,由于其结构简单,所以占用更少的内存资源。
数据装载单元2,用于将所述行式存储结构中的目标列数据装载入所述内存存储单元1。
数据装载单元,从数据源那里获取并装载需要进行查询的目标列数据。装载的周期装载的大小都有数据源确定,数据源会对数据消费者发布其装载有哪些数据,数据消费者即可根据发布的信息对装载的数据进行查询。数据装载单元根据数据源的装载命令进行数据装载。
一般的行式存储结构如下表1所示,一个有1万行的学生表。
表1行式存储结构示例
行号 姓名(name) 年龄(age) 班级(class)
0 张某 17 1
1 李某 22 2
2 王某 21 3
3 赵某 19 2
9999 钱某 21 1
对上表1,要按照年龄=29的找出所有的行,按行存储的做法为:
(1)遍历每一行取到每一行的行对象指针
(2)由行对象指针取到age列的值,如果是采用通用结构,可能按照列age的index或名称进行索引取值。
(3)由于列一般按照通用结构存储,需要对每个age单元格进行(int)类型转换或比较查找,转换后的int与29进行相等比较,判断是否为所选定的行,如是把行指针放到结果队列中。
(4)搜索完成,得到全部的结果行指针。
采用列数组存储该行式存储结构中的各列数据,即将上表1中的姓名(name)作为一个列数组,年龄(age)作为一个列数组,班级(class)作为一个列数组。
数据装载单元将name、age、class三列分别作为name列数组、age列数组和class列数组装载入内存存储单元中。
在数据装载单元向内存存储单元中装载了多个行式存储结构中的数据时,可引入数据表DataTable概念,内存存储单元的创建列数组集合可称为数据表DataTable,一个DataTable包含多个列数组,一个列数组中保存行式存储结构中一列的列数据,数据装载单元将一个行式存储结构中的各列装载入一个的DataTable中的各列数组。
载入时可以行式存储结构的名称命名数据表,以列的名称命名列数组。
查询引擎3,用于根据数据消费者输入的级联查询条件,对所述数据装载单元2装载入所述内存存储单元1的列数据进行查询,获取满足所述级联查询条件的列数据位置标识,发送给行读取单元。
级联查询条件为数据消费者根据自身的数据查询需求编写,有一个个查询条件组成,查询引擎可根据这些查询条件对列数组中的列数据进行直接进行计算,避免了行存储结构中先遍历行,再取行中的目标列,再计算,满足计算条件后记录行号的繁琐计算过程。
查询引擎按照查询条件完成对列数组中所有列数据的计算后,将满足条件的列数据位置标识记录下来,发送给行读取单元。
行读取单元4,根据所述查询引擎3获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
在获得了列数据位置标识后,需要根据列数据位置标识获知与其对应的行存储结构中行号,然后通过行号在行存储结构中获取行该行的所有字段信息,发送给数据消费者。
优选的,为了提高针对相同级联查询条件并且针对相同列数据的查询效率,所述装置还包括:
缓存单元5,用于存储所述查询引擎3的查询数据,当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化时,将所述存储的满足所述级联查询条件的列数据位置标识发送给行读取单元。
由于在实际操作中,会出现数据消费者针对同样的列数组进行相同条件的查询,为了提高查询效率,避免重复工作,本发明的缓存单元5负责保存每次的查询数据,所述的查询数据主要包括三方面的内容,一为本次查询的查询条件;二为本次查询针对的列数组属性信息,三为对列数组使用本次查询条件所获得的列数据位置标识。当前两个信息均为发生变化时,则直接获取列数据位置标识发送给行读取单元去获取相应行数据,发送给数据消费者,对两种信息的一致性判定效率要高过重新对列数组中各数据进行计算,因此缓存单元有利于提高本发明装置的工作效率。
优选的,为了有效使用和控制内存资源,保证***正常运行,所述装置还包括:
周期控制单元6,用于为所述内存存储单元设定内存存储周期,删除数组中超出所述内存存储周期的列数据,还用于为所述缓存单元设定缓存周期,删除缓存单元中超出所述缓存周期的缓存数据。
由于内存资源有限,面对庞大数据量时,不断的将数据加载入内存存储单元,最终会消耗大量资源,造成效率下降,并且有些数据经过查询一段时期后就没有什么用途,可以在内存和缓存中清理。因此设定内存存储周期和缓存周期,删除超出周期的数据,保证本发明装置的正常运行。
优选的,为了保证在对内存存储单元1进行读写操作时的正确性,所述装置还包括:
锁定控制单元7,用于对所述内存存储单元1设定读锁和写锁,控制所述内存存储单元1的读写锁定和解锁。
读锁和写锁是为了确保读写操作的正确性,加锁的方式可以根据实际情况设定,如可对内存存储单元中的数据表进行枷锁,也可以对内存存储单元中的列数组加锁。锁定控制单元的锁定原则是保证同一个时刻只能有一个加载线程处于活跃状态,加载线程未结束时其他的加载线程和读线程都处于等待状态;支持任意多个查询操作并发执行,但是在查询未结束时,加载线程处于等待状态。
基于本发明的实施例一,为了更进一步的说明本发明装置的工作原理,特给出本发明的实施例二,如图2所示。
内存存储单元1进一步包括:
列数据存储模块11,用于创建列数组存储不同列的列数据,以所述列数据在行式存储结构中相应列的字段名称命名该列数组,所述数组下标为列数据位置标识。
所述内存存储单元可包含多个列数据存储模块,每个所述列数据存储模块保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同。
列数据位置标识即为该列数据所在位置的数组下标,数组下标以0开始,根据数组下标取与其相应的行式存储结构中的行号,若行号也是以0开始,则取相同的行号即可,若行号是以1开始,则取“下标+1”的行号即可。
优先使用简单类型将列数据存入列数据存储模块。
即使按列存储也有很多选择,比如int型数据,可以使用int[]或者Integer[],List<Integer>等常用的存储结构。
初始化一个1000万的int[]仅需要15ms,而采用Integer[]需要400ms,相差20多倍,更重要的是占用内存组员,int[]仅需要49MB,而Integer[]需要228MB,如采用ArrayList<Integer>则内部结构等同于Object[],其***和存储只会大于Integer[],结论是不言而喻的,因此采用简单类型存储数组是更有效的存储结构,常见的简单类型如int,bool,double。
数据表存储模块12,用于创建数据表,将所述列数据存储模块11存储的属于相同行式存储结构的列数组存入相同的数据表。
所述内存存储单元可包含多个数据表存储模块,每个数据表存储模块可包含多个列数据存储模块。
为每个所述数据表存储模块12中保存的数据表设置版本号,当所述数据表对应的行式存储结构数据发生变化时,更新所述版本号。
当内存中需要导入多个行式存储表时,为了清晰的表示每个行式存储表中的列,优选的采用数据表,列数组和数据表是从属关系,一个数据表可包含多个列数组,一个行式存储表对应一个数据表,数据表中包含该行式存储中所有列的数据,每个列的列数据存储为一个列数组。
数据装载单元2,用于将所述行式存储结构中的目标列数据装载入所述内存存储单元1中的列数组。
查询引擎3进一步包括:
规则定义存储模块31,用于定义并存储所述级联查询条件的解析规则。
定义的级联查询条件解析规则,即定义级联查询条件中运算符与通用运算符的对应关系。
定义级联运算符对应关系可以为数据消费者输入级联查询条件时提供便利,所述对应关系为自定义,可根据实际情况更改级联运算符的名称。
本发明中提供如表2所示的对应关系示例。
表2级联运算符与通用运算符对应关系
采用表2中记载的对应关系,编写级联查询条件,如下示:
eq('class',2).bw('age',18,20).eq('sex',0).like(‘address’,’%海淀%’)
级联查询条件解析模块32,用于接收数据消费者输入的级联查询条件,根据所述规则定义存储模块31定义的所述级联查询条件的解析规则,解析所述级联查询条件。
根据表2中的对应关系,对上述级联查询条件进行解析。
上述级联查询条件表述的含义为:班级为2、年龄在18(>=)到20(<20)之间、性别为男(0为男)、地址中包含海淀的记录。
查询模块33,根据所述级联查询条件解析模块32解析获得的级联查询条件,逐级对所述列数据存储模块11存储的列数组进行查询,获取满足所述级联查询条件的列数据位置标识。
对这个级联查询条件从左到右执行,每执行一次结果就变小一次,到了最耗时的like操作时,记录条数已经大大减少,执行like的次数也就大大减少,这样的总体的效率就会有提升很多。
行读取单元4,根据所述查询引擎3获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
缓存单元5进一步包括:
查询数据存储模块51,用于存储级联查询条件,该级联查询条件所针对的数据表版本信息和查询获取的列数据位置标识。
为了避免对相同条件相同查询目标数据进行重复查询,通过查询数据存储模块,将每次查询的查询条件、查询目标数据、查询获得的列数据下标进行存储,以便数据消费者针对相同查询条件和目标数据进行查询时,直接发送获取满足条件的列数据下标,提高效率。
一致性检验模块52,用于检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致,以及检验数据消费者要求查询的数据表版本信息与存储的数据表版本信息是否一致。
一致性检验模块就是用来检查缓存中是否存在数据消费者输入的查询条件,以及查询目标数据是否发生变化,通过检验后就可以直接发送存储的满足查询条件的列数据下标。因此一致性检验模块52应进行两个方面的检验,进一步包括:
级联查询条件检验模块521,用于根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致。
判断数据消费者输入的级联查询条件与所述存储的级联查询条件是否相同,通过两个条件判定,一为字符串是否相同,二为是否包含非幂等性函数。字符串相同即依次比对字符串。非幂等性函数为重复执行结果不同的函数,虽然其字符串相同,但由于非幂等性函数的特性,导致其重复执行的结果出现不同,因此包含非幂等性函数的查询条件其实已经发生了变化,应勘定为不相同。比如now()函数为取得当前的时间,它在多次执行的结果是不一致的,意味着如果查询表达式中包含now()函数,这样的查询结果不能重复使用,需要每次进行查询执行。
在对待非幂等性函数时,还有一种处理方式,即查询数据存储模块51在对查询条件进行存储时判断查询条件中是否包含非幂等性函数,如果包含,则不对该查询条件以及与该查询条件对应的相关信息进行存储。
目标数据检验模块522,用于检验数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息是否一致。
查询条件一致,但目标数据发生变化,也会导致查询结果发生变化,因此需要对目标数据进行一致性检验,由于数据表存储了版本信息,当数据表中数据发生变化时会更新版本信息,因此只需要简单的比对数据表版本信息即可完成一致性检验。
查询结果发送模块53,用于当一致性判断模块52的判断结果为一致时,将所述查询数据存储模块51存储的与该级联查询条件对应的列数据位置标识发送给所述行读取单元。
周期控制单元6,用于为所述内存存储单元设定内存存储周期,删除数组中超出所述内存存储周期的列数据,还用于为所述缓存单元设定缓存周期,删除缓存单元中超出所述缓存周期的缓存数据。
锁定控制单元7,用于对所述内存存储单元1设定读锁和写锁,控制所述内存存储单元1的读写锁定和解锁。
为更好的说明本发明装置和工作原理,针对本发明中的表1,基于实施例一、实施例二给出本发明的实施例三,进行详细说明,如图3所示。
步骤S101:列数据存储模块11根据行式存储结构创建列数组。
包括name列数组、age列数组、class列数组。分别以简单数据类型存储每个列数组中的数据。如表3所示。
表3列数组存储示意图
步骤S102:数据表存储模块12创建数据表,保存步骤S101中创建的各列数组,版本号为studentV1.0。
步骤S103:数据消费者根据规则定义存储模块31定义的规则,编写级联查询条件。
编写的级联查询条件为“eq('class',2).bw('age',18,20)”
步骤S104:级联查询条件解析模块32根据规则定义存储模块31定义的规则,对接连查询条件进行解析。
解析的结果为要查询班级为2,年龄在18到20之间的数据。
步骤S105:查询模块33根据查询条件解析模块32解析的查询条件,对数据表存储模块12中存储的class列数组、age列数组进行逐级查询。
先查询class列数组,获得=2的数据下标,为1,3,……;
在此基础上查询age列数组,获得18-20间的数组下标,为3,……。
步骤S106:行读取单元4根据获得的列数据下标在行式存储结构中读取该行的所有行数据信息发送给数据消费者。
行数据读取单元4读取行号为3、……的行数据信息,发送给数据消费者。
步骤S107:查询数据存储模块51存储本次查询的查询条件、和查询条件对应的目标数据版本信息,以及列数据数组下标。
存储的查询条件为:“eq('class',2).bw('age',18,20)”;
存储的目标数据版本信息为:student1.0;
存储的列数据下标为:3、……。
步骤S108:一致性检验模块52接收新的级联查询条件,对新的级联查询条件进行一致性检验,通过检验进入步骤S109,未通过检验进入步骤S104。
步骤S109:在查询数据存储模块51中获取与该级联条件相应的列数据下标,进入步骤S106。
本发明实施例四公开一种列式内存存储查询方法,如图4所示,所述方法包括:
步骤S201:在内存中创建列数组存储行式存储结构中的各列数据。
需要说明的是,在此创建的是空的列数组,其目的是存储行式存储结构的的格列数据。
步骤S202:将所述行式存储结构中的列数据装载入所述创建的列数组。
步骤S203:根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识。
定义并存储所述级联查询条件的解析规则;接收数据消费者输入的级联查询条件,根据所述存储的级联查询条件解析规则,解析所述级联查询条件;根据所述解析后的级联查询条件,逐级对所述列数组中存储的数据进行查询,获取满足所述级联查询条件的列数据位置标识。
步骤S204:根据所述获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
由于在进行列数组存储时,是按照各列数据在行式存储结构中的行顺序存储,因此列数据位置标识(即该列数据所在的数组下标)与其在行式存储结构中所位于行的行号相对应,需要说明的是,数组下标从0开始,如果行式存储结构的行号也从0开始,则列数据所在的数组下标作为其行号即可,如果行式存储结构的行号从1开始,则将列数据所在的数组下标加1后作为其行号即可。
获得了列数据所在的行号,就可以根据行号在行式存储结构中取的整行的信息发送给数据消费者,提高了数据消费者的查询效率。
为了进一步提高相同查询条件、针对相同目标列数组的查询效率,保证合理利用和控制内存资源,保证列数组的读写正确性,优选的,可将一次查询使用的级联查询条件、针对的列数组、获取列数据位置标识存入缓存,当数据消费者输入的所述级联查询条件与存储的级联查询条件相同,且该级联查询条件对应的列数组未发生变化时,根据所述存储的满足所述级联查询条件的列数据位置标识获取行号与所述列数据位置标识一致的所有行数据信息。
设定内存存储周期,删除列数组中超出所述内存存储周期的列数据。
设定缓存周期,删除缓存中超出所述缓存周期的数据。
设定读锁和写锁,控制对所述列数组的读写锁定和解锁。
下面,给出本发明的实施例五,如图5所示,所述方法包括如下步骤:
步骤S301:在内存中创建列数组存储行式存储结构中的各列数据。
创建列数组存储不同列的列数据,以所述列数据在行式存储结构中相应列的字段名称命名该列数组,所述列数组下标为列数据位置标识。
优先使用简单类型将列数据存入列数据存储模块。
使用简单类型存储列数据,可以减少数据存储占用的内存资源,运算速度也会有大幅度提升。
步骤S302:创建数据表,将属于相同行式存储结构的所述列数组存入相同的数据表。
可创建多个所述数据表,每个数据表包含多个所述列数组,每个所述列数组保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同。
存储每个所述数据表的版本号信息,当所述数据表中的列数据发生变化时,更新所述版本号信息。
步骤S303:将所述行式存储结构中的列数据装载入所述创建的数据表中的列数组。
相同行式存储结构中的列数据,装载入一个数据表,该数据表中可包含多个列数组,用于装载该行式存储结构中的各列数据。每列数据对应一个列数组。
步骤S304:根据数据消费者输入的级联查询条件,判断缓存中是否存在与其相同的级联查询条件,若不存在则进入步骤S305,若存在则进入步骤S306。
缓存中存储了在缓存周期内以往数据消费者对目标列数据按照查询条件进行查询的相关信息,若发现本次查询的查询条件曾经用过,则进一步判断针对的目标列数据是否相同;若本次查询的查询条件不曾出现,则按照新的查询条件进行查询。
步骤S305:根据所述消费者输入的级联查询条件,对所述装载入列数组中的数据进行查询,获取满足所述级联查询条件的列数据位置标识,将本次查询的查询数据存入缓存,进入步骤S308。
本次查询为新的查询,则在完成本次查询时,将查询数据存入缓存,当出现与本次查询相同的查询时,可以直接取出查询获得的列数据标识,进行行数据的读取,能够提高效率。
本次查询的查询数据包括所述使用的级联查询条件、本次查询针对的数据表版本信息以及本次查询获得的所述列数据位置标识。
步骤S306:判断缓存中与该级联查询条件对应的数据表版本信息是否发生变化,若发生变化则进入步骤S305,若没有发生变化,则进入步骤S307。
若数据表版本信息发生了变化,则说明目标列数据可能发生了更新,重新被装载或发生了其他变化,因此查询发生了变化,不能使用之前的查询结果,因此需要返回步骤S305。
步骤S307:在缓存中获取与所述级联查询条件相对应的列数据位置标识。
步骤S308:根据所述获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
若数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息一致,则判定该级联查询条件对应的列数组未发生变化。
为了更清晰的说明如何对级联查询条件完成规则定义和解析,以及如何判定查询条件是否一致,给出本发明的实施例六,如图6所示。
在一次查询中往往是多条件的,如查找“班级是2班,年龄在18~20之间,性别为男性的学生”,查询解析需要逐个条件来执行,在任何字段无索引公平的情况下,这样的处理对程序来说是非常容易的,它就逐个条件执行即可,但显然这三个条件是and的关系,第1个条件执行完成,不应该在所有的行上在执行第2个条件而应该在第1个的结果上做,采用级联表达式来描述级联查询条件,可实现对各条件的逐级查询,进一步提高查询效率。因此这里设定级联表达式的撰写方式。
步骤S401:定义并存储所述级联查询条件的解析规则。
定义的级联查询条件解析规则,即定义级联查询条件中运算符与通用运算符的对应关系。如上文中表2所示。
定义级联运算符对应关系可以为数据消费者输入级联查询条件时提供便利,所述对应关系为自定义,可根据实际情况更改级联运算符的名称。
步骤S402:接收数据消费者输入的级联查询条件,根据所述存储的级联查询条件解析规则,解析所述级联查询条件。
按照简单的查询条件放在前面,复杂的查询条件放在后面的原则编写级联查询条件。
对级联查询条件从左到右执行,每执行一次结果就变小一次,到了最耗时的操作时,记录条数已经大大减少,执行like的次数也就大大减少,这样的总体的效率就会有提升很多,如下面的图7所示。
按照上述思路,在用户输入级联查询条件时,可以按照将不耗时的操作(如equal)前置,耗时的操作(like)后置,整体效率就会有更大幅度的提升。
步骤S403:根据所述解析后的级联查询条件,判断所述级联查询条件字符串与缓存中存储的字符串是否相同,若相同则进入步骤S404,若不相同,则进入步骤S405。
判断字符串是否相同,只需要逐个核对即可获得结果,不再赘述。
步骤S404:判断所述级联查询条件中是否包含非幂等性函数,如果包含则进入步骤S405,如果不包含则进入步骤S406。
在字符串完全相同的情况下,如果字符串中包含非幂等性函数,表示该字符串描述的级联查询条件很可能发生了变化。
如非幂等性函数now(),表示取当前状态,而缓存中保存的查询结果数据,是之前查询过的结果数据,并不是当前的结果数据,因此不能直接获取。
步骤S405:确定数据消费者输入的级联查询条件与缓存中的级联查询条件不一致。
步骤S406:确定数据消费者输入的级联查询条件与缓存中的级联查询条件一致。
本方法中各步骤的详细实现过程,可参见上文中的装置部分描述,因此不再赘述。
虽然本发明所揭露的实施方式如上,然而所述的内容并非用以直接限定本发明的保护范围。任何本发明所属技术领域中技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作些许的更动。本发明的保护范围,仍须以所附的权利要求书所界定的范围为准。

Claims (13)

1.一种列式内存存储查询装置,其特征在于,所述装置包括:
内存存储单元,用于在内存中创建列数组存储行式存储结构中的各列数据;
数据装载单元,用于将所述行式存储结构中的目标列数据装载入所述内存存储单元;
查询引擎,用于根据数据消费者输入的级联查询条件,对所述数据装载单元装载入所述内存存储单元的列数据进行查询,获取满足所述级联查询条件的列数据位置标识,发送给行读取单元;
行读取单元,根据所述查询引擎获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
2.根据权利要求1所述的装置,其特征在于,所述装置还包括:
缓存单元,用于存储所述查询引擎的查询数据,当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化时,将所述存储的满足所述级联查询条件的列数据位置标识发送给行读取单元;
周期控制单元,用于为所述内存存储单元设定内存存储周期,删除数组中超出所述内存存储周期的列数据,还用于为所述缓存单元设定缓存周期,删除缓存单元中超出所述缓存周期的缓存数据;
锁定控制单元,用于对所述内存存储单元设定读锁和写锁,控制所述内存存储单元的读写锁定和解锁。
3.根据权利要求2所述的装置,其特征在于,所述内存存储单元进一步包括:
列数据存储模块,用于创建列数组存储不同列的列数据,以所述列数组在行式存储结构中相应列的字段名称命名该列数组,所述数组下标为列数据位置标识;
数据表存储模块,用于创建数据表,将所述列数据存储模块存储的属于相同行式存储结构的列数组存入相同的数据表;
所述内存存储单元可包含多个数据表存储模块,每个数据表存储模块可包含多个列数据存储模块,每个所述列数据存储模块保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同;
优先使用简单类型将所述列数据存入列数据存储模块。
4.根据权利要求3所述的装置,其特征在于:
为每个所述数据表存储模块中保存的数据表设置版本号,当所述数据表对应的所述行式存储结构数据发生变化时,更新所述版本号。
5.根据权利要求4所述的装置,其特征在于,所述查询引擎进一步包括:
规则定义存储模块,用于定义并存储所述级联查询条件的解析规则;
级联查询条件解析模块,用于接收数据消费者输入的级联查询条件,根据所述规则定义存储模块定义的所述级联查询条件的解析规则,解析所述级联查询条件;
查询模块,根据所述级联查询条件解析模块解析获得的级联查询条件,逐级对所述列数据存储模块存储的列数组进行查询,获取满足所述级联查询条件的列数据位置标识。
6.根据权利要求5所述的装置,其特征在于,所述缓存单元进一步包括:
查询数据存储模块,用于存储级联查询条件,该级联查询条件所针对的数据表版本信息和查询获取的列数据位置标识;
一致性检验模块,用于检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致,以及检验数据消费者要求查询的数据表版本信息与存储的数据表版本信息是否一致;
查询结果发送模块,用于当一致性判断模型的检验结果为一致时,将所述查询数据存储模块存储的与该级联查询条件对应的列数据位置标识发送给所述行读取单元。
7.根据权利要求6所述的装置,其特征在于,所述一致性检验模块进一步包括:
级联查询条件检验模块,用于根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致;
目标数据检验模块,用于检验数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息是否一致。
8.一种列式内存存储查询方法,其特征在于,所述方法包括:
在内存中创建列数组存储行式存储结构中的各列数据;
将所述行式存储结构中的列数据装载入所述创建的列数组;
根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识;
根据所述获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
将一次查询使用的级联查询条件、针对的列数组、获取列数据位置标识存入缓存,当数据消费者输入的所述级联查询条件与存储的级联查询条件相同,且该级联查询条件对应的列数组未发生变化时,根据所述存储的满足所述级联查询条件的列数据位置标识,获取行号与所述列数据位置标识一致的所有行数据信息;
设定内存存储周期,删除列数组中超出所述内存存储周期的列数据;
设定缓存周期,删除缓存中超出所述缓存周期的数据;
设定读锁和写锁,控制对所述列数组的读写锁定和解锁。
10.根据权利要求9所述的方法,其特征在于,所述在内存中创建列数组存储行式存储结构中的各列数据的方法具体为:
创建列数组存储不同列的列数据,以所述列数据在行式存储结构中相应列的字段名称命名该列数组,所述列数组下标为列数据位置标识;
创建数据表,将属于相同行式存储结构的所述列数组存入相同的数据表;
可创建多个所述数据表,每个数据表包含多个所述列数组,每个所述列数组保存行式存储结构中一列的列数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同;
优先使用简单类型将列数据存入列数据存储模块。
11.根据权利要求10所述的方法,其特征在于:
存储每个所述数据表的版本号信息,当所述数据表中的列数据发生变化时,更新所述版本号信息。
12.根据权利要求11所述的方法,其特征在于,所述根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识的方法具体为:
定义并存储所述级联查询条件的解析规则;
接收数据消费者输入的级联查询条件,根据所述存储的级联查询条件解析规则,解析所述级联查询条件;
根据所述解析后的级联查询条件,逐级对所述列数组中存储的数据进行查询,获取满足所述级联查询条件的列数据位置标识。
13.根据权利要求12所述的方法,其特征在于,所述判定当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化的方法具体为:
根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致;
若数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息一致,则判定该级联查询条件对应的列数组未发生变化。
CN201310744231.9A 2013-12-30 2013-12-30 一种列式内存存储查询装置及列式内存存储查询方法 Active CN104750727B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310744231.9A CN104750727B (zh) 2013-12-30 2013-12-30 一种列式内存存储查询装置及列式内存存储查询方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310744231.9A CN104750727B (zh) 2013-12-30 2013-12-30 一种列式内存存储查询装置及列式内存存储查询方法

Publications (2)

Publication Number Publication Date
CN104750727A true CN104750727A (zh) 2015-07-01
CN104750727B CN104750727B (zh) 2019-03-26

Family

ID=53590426

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310744231.9A Active CN104750727B (zh) 2013-12-30 2013-12-30 一种列式内存存储查询装置及列式内存存储查询方法

Country Status (1)

Country Link
CN (1) CN104750727B (zh)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105589969A (zh) * 2015-12-23 2016-05-18 浙江大华技术股份有限公司 一种数据处理方法及装置
CN107092624A (zh) * 2016-12-28 2017-08-25 北京小度信息科技有限公司 数据存储方法、装置及***
CN107436767A (zh) * 2017-07-31 2017-12-05 杭州安恒信息技术有限公司 一种异步框架中幂等操作的优化方法
CN109101516A (zh) * 2017-11-30 2018-12-28 新华三大数据技术有限公司 一种数据查询方法和服务器
CN109165378A (zh) * 2018-08-15 2019-01-08 北京天安智慧信息技术有限公司 复杂功能报表定制方法及***
CN109445945A (zh) * 2018-10-29 2019-03-08 努比亚技术有限公司 应用程序的内存分配方法、移动终端、服务器及存储介质
CN110069487A (zh) * 2017-09-28 2019-07-30 北京国双科技有限公司 一种数据处理方法、装置及***
CN113168413A (zh) * 2018-10-09 2021-07-23 塔谱软件公司 用于交互式数据准备应用的多个数据集的相关增量加载
US11386089B2 (en) 2020-01-13 2022-07-12 The Toronto-Dominion Bank Scan optimization of column oriented storage
CN117931802A (zh) * 2024-01-25 2024-04-26 南京雀翼信息科技有限公司 一种多数据源的高速写入读取***及其方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102136005B (zh) * 2011-03-29 2013-07-17 北京航空航天大学 数据查询方法和装置
CN103246498A (zh) * 2013-05-13 2013-08-14 浪潮集团山东通用软件有限公司 一种支持关系数据并行处理的内存存储结构及实现方法

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105589969A (zh) * 2015-12-23 2016-05-18 浙江大华技术股份有限公司 一种数据处理方法及装置
CN107092624A (zh) * 2016-12-28 2017-08-25 北京小度信息科技有限公司 数据存储方法、装置及***
CN107436767A (zh) * 2017-07-31 2017-12-05 杭州安恒信息技术有限公司 一种异步框架中幂等操作的优化方法
CN110069487A (zh) * 2017-09-28 2019-07-30 北京国双科技有限公司 一种数据处理方法、装置及***
CN109101516A (zh) * 2017-11-30 2018-12-28 新华三大数据技术有限公司 一种数据查询方法和服务器
US11269881B2 (en) 2017-11-30 2022-03-08 New H3C Big Data Technologies Co., Ltd. Data query
CN109165378A (zh) * 2018-08-15 2019-01-08 北京天安智慧信息技术有限公司 复杂功能报表定制方法及***
CN113168413A (zh) * 2018-10-09 2021-07-23 塔谱软件公司 用于交互式数据准备应用的多个数据集的相关增量加载
CN113168413B (zh) * 2018-10-09 2022-07-01 塔谱软件公司 用于交互式数据准备应用的多个数据集的相关增量加载
CN109445945A (zh) * 2018-10-29 2019-03-08 努比亚技术有限公司 应用程序的内存分配方法、移动终端、服务器及存储介质
CN109445945B (zh) * 2018-10-29 2023-09-19 努比亚技术有限公司 应用程序的内存分配方法、移动终端、服务器及存储介质
US11386089B2 (en) 2020-01-13 2022-07-12 The Toronto-Dominion Bank Scan optimization of column oriented storage
CN117931802A (zh) * 2024-01-25 2024-04-26 南京雀翼信息科技有限公司 一种多数据源的高速写入读取***及其方法

Also Published As

Publication number Publication date
CN104750727B (zh) 2019-03-26

Similar Documents

Publication Publication Date Title
CN104750727A (zh) 一种列式内存存储查询装置及列式内存存储查询方法
CN107391653B (zh) 一种分布式NewSQL数据库***及图片数据储存方法
CN109299100B (zh) 管理内存数据及在内存中维护数据的方法和***
CN102799634B (zh) 数据存储方法及装置
CN104765731B (zh) 数据库查询优化方法和设备
CN104361113B (zh) 一种内存‑闪存混合存储模式下的olap查询优化方法
US20120179699A1 (en) Systems and methods for high-speed searching and filtering of large datasets
US20150261793A1 (en) Method for implementing database
CN110196847A (zh) 数据处理方法和装置、存储介质及电子装置
CN107577436A (zh) 一种数据存储方法及装置
CN106326475A (zh) 一种高效的静态哈希表实现方法及***
CN105608214B (zh) 对布控车牌号码进行快速搜索的方法
CN106886568A (zh) 一种分表方法、装置及电子设备
US8756208B2 (en) Encoded data processing
CN107291471A (zh) 一种支持可定制化数据采集的元模型框架***
CN107729504A (zh) 一种处理大数据对象的方法及***
CN103336828B (zh) 实时数据库读取及写入方法
CN101441654B (zh) 数据库检索方法及***
US20140067853A1 (en) Data search method, information system, and recording medium storing data search program
CN109697068A (zh) 一种分库分表模式下逻辑sql语句翻译方法和装置
CN111126461A (zh) 基于机器学习模型解释的智慧审计方法
US8131728B2 (en) Processing large sized relationship-specifying markup language documents
CN104462080A (zh) 针对检索结果进行分组统计的索引结构创建方法和***
KR101955376B1 (ko) 비공유 아키텍처 기반의 분산 스트림 처리 엔진에서 관계형 질의를 처리하는 방법, 이를 수행하기 위한 기록 매체 및 장치
CN111522820A (zh) 数据存储结构、存储检索方法、***、设备及存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
TA01 Transfer of patent application right
TA01 Transfer of patent application right

Effective date of registration: 20180705

Address after: 110179 room 519, 2-1 Gao Ge Road, Hunnan New District, Shenyang, Liaoning.

Applicant after: Yiyang Computer Technology Co.,Ltd. Shenyang

Address before: No. 1 building, hi tech Development Zone, Songshan Road, Nangang District, Harbin, Heilongjiang

Applicant before: BOCO INTER-TELECOM Co.,Ltd.

GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20230704

Address after: 150001 Building 1, High tech Development Zone, Songshan Road, Nangang District, Harbin City, Heilongjiang Province

Patentee after: BOCO INTER-TELECOM Co.,Ltd.

Address before: 110179 room 519, 2-1 Gao Ge Road, Hunnan New District, Shenyang, Liaoning.

Patentee before: Yiyang Computer Technology Co.,Ltd. Shenyang