索引构建方法、查询方法及装置的制造方法_3

文档序号:9787432阅读:来源:国知局
table where C2>5;
[0094] Q2:select......from table where Cl contains(A';
[0095] Q3:select......from table where C2>0 and C2< = 5;
[0096] 假设初始阶段,第一数据文件的索引文件为空(null);当获取到QO时,从QO中提取 出查询项"C2>0",确定满足查询项"C2>0"的数据所在的数据行,然后生成数据行指示信息, 将查询项"C2>0"以及对应的数据行指示信息存储到索引文件中,此时的索引文件如下表3 所示。在该实例中
[0097] 使用bit-map这一数据存储结构。表3
[0099]接下来,获取到Ql,从Ql中提取出查询项"C2>5",确定满足查询项"C2>5"的数据所 在的数据行,然后生成数据行指示信息,将查询项"C2>5"以及对应的数据行指示信息存储 到索引文件中,此时的索引文件如下表4所示。
[0100]表4
[0102] 接下来,获取到Q2,从Q2中提取出查询项"Cl contains'A'",确定满足查询项"Cl contains'A'"的数据所在的数据行,然后生成数据行指示信息,将查询项"Cl contains 'A'"以及对应的数据行指示信息存储到索引文件中,此时的索引文件如下表5所示。
[0103] 表5
[0105] 接下来,获取到Q3,从Q3中提取出查询项"C2>0"和"C2〈 = 5",确定满足查询项"C2> 〇"的数据所在的数据行,然后生成数据行指示信息,将查询项"C2>0"以及对应的数据行指 示信息存储到索引文件中,此时,会发现查询项"C2>0"及对应的数据行指示信息已经存在 于索引文件中,故可以将其丢弃。而关于查询项"〇2〈 = 5",确定满足查询项"02〈 = 5"的数据 所在的数据行,然后生成数据行指示信息,将查询项"C2〈 = 5"以及对应的数据行指示信息 存储到索引文件中,由于查询项"C2〈 = 5"不符合预设的存储要求,于是可以对查询项"C2〈 =5"及对应的数据行指示信息进行取反操作,从而获得查询项"C2>5"以及对应的数据行指 示信息,此时会发现查询项"C2>5"以及对应的数据行指示信息已经存在于索引文件中,于 是可以将其丢弃。在处理完Q〇、Ql和Q2之后可以得到如表5所示的索引文件。
[0106]另外,在上述处理Q3的过程中可以发现,随着索引文件中查询项及其对应的数据 行指示信息的不断逐渐增多,有可能会出现重复的查询项及数据行指示信息,为了节约处 理资源,提高构建索引的效率,可以在获取各查询项对应的数据行指示信息之前,先将提取 到的各查询项在已构建的索引文件中进行匹配,如果在索引文件中匹配到该查询项,则结 束对该查询项的处理并进入对下一个查询项的处理过程;如果在索引文件中未匹配到该查 询项,则继续执行获取该查询项对应的数据行指示信息以及后续操作。
[0107] 进一步,有可能对查询项进行取反操作之后,与索引文件中已有的查询项存在重 复,为了节约处理资源,提高构建索引的效率,可以在获取各查询项对应的数据行指示信息 之前,可以对提取到的各查询项进行取反操作,将取反后的查询项在索引文件中进行匹配; 如果在索引文件中匹配到该取反后的查询项,则结束对该查询项的处理并进入对下一个查 询项的处理过程;如果在索引文件中未匹配到该取反后的查询项,则继续执行获取该查询 项对应的数据行指示信息以及后续操作。
[0108] 关于本实施例中的查询项和查询项对应的数据行指示信息在作为索引时是否能 够提高查询速度,以及在应用过程中对索引文件进行更新的过程将在下面实施例中进行描 述。
[0109] 图2为本发明另一实施例提供的查询方法的流程示意图。如图2所示,该方法包括:
[0110] 201、接收当前用于查询第一数据文件的查询请求。
[0111] 202、从查询请求的查询条件中提取至少一个查询项。
[0112] 203、根据第一数据文件的索引文件中存储的已有查询项和已有查询项对应的数 据行指示信息,对至少一个查询项中能够被改写的查询项进行改写;所述数据行指示信息 用于指示满足已有查询项的数据所在的数据行。
[0113] 204、根据至少一个查询项中被改写的查询项和未被改写的查询项,在第一数据文 件中进行查询,以获取待查询的数据。
[0114] 本实施例的执行可基于前述各方法实施例给出的索引文件。关于相关数据的定义 或解释可参见前述实施例中的描述,在此不再赘述。
[0115] 在此说明,可以预先构建索引文件,然后基于所构建的索引文件进行数据查询;或 者,也可以将构建索引文件的过程与数据查询过程糅合在一起,即基于已构建的索引文件 进行数据查询,并在数据查询过程中不断完善索引文件。
[0116] 在本实施例中,假设在获取当前用于查询第一数据文件的查询请求之前,已经存 在索引文件,该索引文件可以是预先离线形成的,也可以是在之前的数据查询过程中在线 形成的。则基于索引文件的数据查询过程具体如下:首先,接收当前用于查询第一数据文件 的查询请求。在现有技术中,当拿到查询请求后,会直接根据查询请求中的查询条件,去第 一数据文件中读取查询条件涉及的各列数据,当将所需的各列数据读取到内存之后,再进 行数据筛选等处理,最终获得所需的数据。这会涉及大量IO操作,导致数据查询效率较低。 而本实施例并不像现有技术那样直接去第一数据文件中读取数据,而是从查询请求的查询 条件中提取至少一个查询项,然后根据第一数据文件的索引文件中存储的已有查询项和已 有查询项对应的数据行指示信息,对至少一个查询项中能够被改写的查询项进行改写,然 后根据至少一个查询项中被改写的查询项和未被改写的查询项,在第一数据文件中进行查 询,以获得待查询数据。
[0117] 上述数据行指示信息用于指示满足已有查询项的数据所在的数据行。对于以列为 单位进行存储的列式存储系统中,如果知道了待查询数据所在的数据行,进一步加上其它 条件,可以将待查询数据锁定在较小的数据范围内,甚至可以确定数据的精确位置(所在行 和所在列),这与读取所有可能的数据相比,有利于减少IO操作,有利于提高查询效率。 [0118]上述能够被改写的查询项是指能够利用索引文件中存储的已有查询项和已有查 询项对应的数据行指示信息进行改写的查询项。而数据行指示信息指示出满足已有查询项 的数据所在的数据行,这意味着被改写后的查询项所对应的数据查询范围将极大缩小,有 利于减少IO操作,提高查询效率。
[0119] 关于上述步骤202,其【具体实施方式】,与构建索引文件过程中的相应步骤相同,可 参见前述实施例中相应部分的描述,在此不再赘述。
[0120] 在一可选实施方式中,上述步骤203具体可采用以下实施方式实现:
[0121] 对于至少一个查询项中每个查询项,可以将该查询项在索引文件中进行匹配; [0122] 如果在索引文件中匹配到与该查询项相同的已有查询项,则根据所述匹配到的已 有查询项对应的数据行指示信息对该查询项进行改写。例如,可以将该查询项改写为待查 询项数据行等于所述匹配到的已有查询项对应的数据行指示信息所指示的数据行。与改写 前的查询项相比,改写后的查询项直接给出待查询数据所在的数据行,其能够极大的减少 数据范围。
[0123] 举例说明,以上述表1所示第一数据文件为例,并结合上述表5所示索引文件,则假 设接收到查询请求Q4:select count(*)as result from table where Cl contains'A' and C2>0,从Q4中提取查询项"Cl contains'A'"和查询项"C2>0",通过将两个查询项在表5 所示的索引文件中进行比较,发现表5中已经存在这两个查询项,意味着这两个查询项可以 被改写,于是根据表5所示索引文件中的已有查询项及其对应的数据行指示信息对这两个 查询项进行改写。例如,可以将查询项"C2>0"改写为行号(line) =0110001,将查询项"C1 C〇ntains'A'"改写为line = 1100100。这里直接使用数据行指示信息表示所指示的数据行, 但不限于此。与"C2>0"这一查询条件相比,改写后的查询项明确限定了待查询数据所在的 数据行,可以直接从第2、3和7行中读取待查询数据,数据范围较小,IO操作的次数相对较 少,查询效率较高。
[0124] 在上述举例的查询请求中,不存在未被改写的查询项,则可以直接根据各被改写 的查询项在第一数据文件中进行查询,以获得待查询数据。例如,可以将各被改写的查询项 按照原来的逻辑运算关系进行组合,以形成新的查询条件,使用新的查询条件到第一数据 文件中进行查询。例如,将由查询项"C2>0"改写的Iine = Ol 10001与由查询项"Cl contains 'A'"改写的line = 1100100进行与运算,从而获得新的查询条件为line = 0100000,从而将 待查询数据限定在第2行数据中。
[0125] 进一步,假设接收到查询请求Q5: select......from table where C2>0and C2〈 = 5,从Q5中提取查询项"C2>0"和查询项"C2〈 = 5",通过将两个查询项在表5所示的索引文件 中进行比较,发现表5中已经存在查询项"C2>0",意味着查询项"C2>0"属于可改写的查询 项;而表5中不存在查询项"C2〈 = 5",但是查询项"C2〈 = 5"取反后得到的查询项"C2>5"存在 于表5中,这意味着查询项"C2〈 = 5"实际上也属于可改写的查询项。
[0126] 在上述分析中发现,在将查询项在索引文件中进行匹配之前,可以判断该查询项 中的运算符是否属于关系运算符;当该查询项中的运算符属于关系运算符时,进一步判断 该查询项中的运算符是否属于预先规定的可以存储到索引文件中的运算符;若判断结果为 否,即该查询项中的运算符不属于预先规定的可以存储到索引文件中的运算符,则可以先 对该查询项进行取反操作,以获得取反后的查询项,然后将取反后的查询项在索引文件中 进行匹配,以判断该查询项是否可以被改写。
[0127] 在经过上述匹配操作后,发现查询项"C2>0"和查询项"C2〈 = 5"都属于可改写的查 询项,于是根据表5所示索引文件中的已有查询项及其对应的数据行指示信息对这两个查 询项进行改写。例如,可以将查询项"C2>0"改写为行号(line) =0110001,将查询项"C2〈 = 5"改写为line = 1111110。这里直接使用数据行指示信息表示所指示的数据行,但不限于 此。与"C2>0"这一查询条件相比,改写后的查询项明确限定了待查询数据所在的数据行,可 以直接从第2、3和7行中读取待查询数据,数据范围较小,IO操作的次数相对较少,查询效率 较高。
[0128] 在上述举例的查询请求中,不存在未被改写的查询项,则可以直接根据各被改写 的查询项在第一数据文件中进行查询,以获得待查询数据。例如,可以将各被改写的查询项 按照原来的逻辑运算
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1