发明内容
本发明提供了一种列式内存存储查询装置,其特征在于,所述装置包括:
内存存储单元,用于在内存中创建列数组存储行式存储结构中的各列数据;
数据装载单元,用于将所述行式存储结构中的目标列数据装载入所述内存存储单元;
查询引擎,用于根据数据消费者输入的级联查询条件,对所述数据装载单元装载入所述内存存储单元的列数据进行查询,获取满足所述级联查询条件的列数据位置标识,发送给行读取单元;
行读取单元,根据所述查询引擎获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
优选的,所述装置还包括:
缓存单元,用于存储所述查询引擎的查询数据,当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化时,将所述存储的满足所述级联查询条件的列数据位置标识发送给行读取单元;
周期控制单元,用于为所述内存存储单元设定内存存储周期,删除数组中超出所述内存存储周期的列数据,还用于为所述缓存单元设定缓存周期,删除缓存单元中超出所述缓存周期的缓存数据;
锁定控制单元,用于对所述内存存储单元设定读锁和写锁,控制所述内存存储单元的读写锁定和解锁。
详细的,所述内存存储单元进一步包括:
列数据存储模块,用于创建列数组存储不同列的列数据,以所述列数组在行式存储结构中相应列的字段名称命名该列数组,所述数组下标为列数据位置标识;
数据表存储模块,用于创建数据表,将所述列数据存储模块存储的属于相同行式存储结构的列数组存入相同的数据表;
所述内存存储单元可包含多个数据表存储模块,每个数据表存储模块可包含多个列数据存储模块,每个所述列数据存储模块保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同;
优先使用简单类型将所述列数据存入列数据存储模块。
优选的,为每个所述数据表存储模块中保存的数据表设置版本号,当所述数据表对应的所述行式存储结构数据发生变化时,更新所述版本号。
具体的,所述查询引擎进一步包括:
规则定义存储模块,用于定义并存储所述级联查询条件的解析规则;
级联查询条件解析模块,用于接收数据消费者输入的级联查询条件,根据所述规则定义存储模块定义的所述级联查询条件的解析规则,解析所述级联查询条件;
查询模块,根据所述级联查询条件解析模块解析获得的级联查询条件,逐级对所述列数据存储模块存储的列数组进行查询,获取满足所述级联查询条件的列数据位置标识。
具体的,所述缓存单元进一步包括:
查询数据存储模块,用于存储级联查询条件,该级联查询条件所针对的数据表版本信息和查询获取的列数据位置标识;
一致性检验模块,用于检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致,以及检验数据消费者要求查询的数据表版本信息与存储的数据表版本信息是否一致;
查询结果发送模块,用于当一致性判断模型的判断结果为一致时,将所述查询数据存储模块存储的与该级联查询条件对应的列数据位置标识发送给所述行读取单元。
更具体的,所述一致性检验模块进一步包括:
级联查询条件检验模块,用于根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致;
目标数据检验模块,用于检验数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息是否一致。
本发明还公开一种列式内存存储查询方法,所述方法包括:
在内存中创建列数组存储行式存储结构中的各列数据;
将所述行式存储结构中的列数据装载入所述创建的列数组;
根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识;
根据所述获取的列数据位置标识在所述行式存储结构中获取行号与所述列数据位置标识一致的所有行数据信息,发送给数据消费者。
优选的,所述方法还包括:
将一次查询使用的级联查询条件、针对的列数组、获取列数据位置标识存入缓存,当数据消费者输入的所述级联查询条件与存储的级联查询条件相同,且该级联查询条件对应的列数组未发生变化时,根据所述存储的满足所述级联查询条件的列数据位置标识,获取行号与所述列数据位置标识一致的所有行数据信息;
设定内存存储周期,删除列数组中超出所述内存存储周期的列数据;
设定缓存周期,删除缓存中超出所述缓存周期的数据;
设定读锁和写锁,控制对所述列数组的读写锁定和解锁。
详细的,所述在内存中创建列数组存储行式存储结构中的各列数据的方法具体为:
创建列数组存储不同列的列数据,以所述列数据在行式存储结构中相应列的字段名称命名该列数组,所述列数组下标为列数据位置标识;
创建数据表,将属于相同行式存储结构的所述列数组存入相同的数据表;
可创建多个所述数据表,每个数据表包含多个所述列数组,每个所述列数组保存行式存储结构中一列的数据,所述列数据位置标识和与其相应的行式存储结构中的行号相同;
优先使用简单类型将列数据存入列数据存储模块。
优选的,存储每个所述数据表的版本号信息,当所述数据表中的列数据发生变化时,更新所述版本号信息。
详细的,所述根据数据消费者输入的级联查询条件,对所述装载入列数组中的列数据进行查询,获取满足所述级联查询条件的列数据位置标识的方法具体为:
定义并存储所述级联查询条件的解析规则;
接收数据消费者输入的级联查询条件,根据所述存储的级联查询条件解析规则,解析所述级联查询条件;
根据所述解析后的级联查询条件,逐级对所述列数组中存储的数据进行查询,获取满足所述级联查询条件的列数据位置标识。
更详细的,所述判定当数据消费者输入的所述级联查询条件与存储的级联查询条件一致,且该级联查询条件对应的列数组未发生变化的方法具体为:
根据若级联查询条件字符串相同且级联查询条件中不包含非幂等性函数则判定级联查询条件一致的规则,检验数据消费者输入的级联查询条件与所述存储的级联查询条件是否一致;
若数据消费者要求查询的数据表版本信息与所述存储的数据表版本信息一致,则判定该级联查询条件对应的列数组未发生变化。
本发明通过将行式存储结构中的数据装载入内存,以列数组的方式进行存储,查询符合条件的数据,并获取该数据的列数据位置标识(即数据所在数组位置的下标),通过该标识获取符合查询条件的行号,进而获取整行数据,这样做的好处是,在查询时不需要遍历每一行取每一行的信息后,对目标列进行比较计算,而是直接针对行存储结构中的该列所有数据,将其放入数组中进行统一比对,获得满足条件的行号,再获取满足条件的行数据,大大节约了遍历和对每行均进行取值比较计算的时间,提升了查询的效率;同时本发明提供级联查询条件供数据消费者自由编辑,通过逐级查询逐步缩小查询范围,进一步提高查询效率;优选的,本发明还提供缓存,用于保存以往查询的状态信息和结果信息,当下一次级联查询条件到来时,如果查询条件、目标列数组均未发生变化,则直接根据存储的查询列数组位置标识读取行信息发送给数据消费者,进一步提高了查询效率,综上所述,本发明提供了一种支持高速高效查询的列式内存存储查询方式。
具体实施方式
以下将配合图式及实施例来详细说明本发明的实施方式,藉此对本发明如何应用技术手段来解决技术问题并达成技术功效的实现过程能充分理解并据以实施。
如图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:确定数据消费者输入的级联查询条件与缓存中的级联查询条件一致。
本方法中各步骤的详细实现过程,可参见上文中的装置部分描述,因此不再赘述。
虽然本发明所揭露的实施方式如上,然而所述的内容并非用以直接限定本发明的保护范围。任何本发明所属技术领域中技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作些许的更动。本发明的保护范围,仍须以所附的权利要求书所界定的范围为准。