稀疏数据的访问方法及***
技术领域
本发明涉及数据访问技术领域,尤其涉及稀疏数据的访问方法及***。
背景技术
日志文件广泛应用于各种服务中,如网页服务器,数据库和应用服务器。日志用来记录不同类型的信息,这些信息拥有不同的重要性等级。日志可以用于调试和排错。通常情况下,日志文件集中保存在网络文件***中,但也可以分散保存(每个服务器包含应用程序自身运行所产生的日志)。能够从各种日志中有效地提取有用信息对于开发/调试应用,以及确保生产环境的正确运行,都是一项十分重要的任务。然而日志通常是文本文件,因此搜索和分析日志就很困难并且要花费高昂的代价。首先要将日志文件存储到数据库的结构化或半结构化的表里。再通过查询数据库,运用复杂的算法来进行模式识别、统计分析或机器学习,从而获取所需要的信息。
目前现有日志分析***中,都采用反数据库范式的设计。和传统的数据库***的三范式设计不同,日志表被设计为单表,以便保证日志的加载速度。因为日志随时随地产生,且数据巨大,需要不间断地加载到分析***中,如果采用第三范式的设计方法,将影响加载数据。而采用单表则有比较好的加载性能,因为不需要更新和管理多张相互关联的表,但这样做的代价就是会导致表非常巨大。因此现有日志分析***,对日志信息并没有采用特殊的存储和访问方法。而日志的有用信息是相当稀疏的,导致对日志的检索非常低效。
一般情况下,在海量的日志信息中,只有很少的日志条目含有有用信息。例如,跟踪网页服务器流量的日志,其中只有极小一部分含有恶意软件行为相关的信息,或者含有其他特定网页搜索行为的相关日志条目。相对所有的网页流量而言,这些恶意软件和网页搜索行为是极少的(我们称之为稀疏数据),但他们仍然具有重要的意义(因为这些极有可能就是客户要对某些案例做分析或查询所需要的信息)。第二个例子是,设想下SQL查询数据库的相关日志。数据库里一张表的一列记录了每条SQL语句的相关日志,比如SQL错误信息。如果这条SQL执行成功则记为null,否则存储出错信息。由于大多数SQL语句会执行成功,并不会有相关错误信息,这个列的数据就会是稀疏的(几乎都是NULL),但SQL出现错误的语义价值肯定是很高的,因为这些信息正是用户所关注的。
通过上述两种情况,可以看到,稀疏数据列含有相当重要的语义信息,以它们作为查询条件的语句肯定是100%存在的。目前主流数据库均支持二级索引,但传统上基于BTree的二级索引无法高效地支持稀疏检索。
现有技术中,对于这个问题的对策是,在这个稀疏列上创建二级索引。然而当表非常大而且数据流入速率非常高时,索引不是一个好的解决方法,因为索引的更新会降低数据流人速率。但如果没有索引或其它措施,以稀疏数据为过滤条件对含有日志信息的表执行的查询,将会进行全表扫描(或仅受限于日期范围的扫描),进而导致非常慢的访问速度。
因此,现有技术中的缺陷是,对于稀疏数据的访问,通过在稀疏列上创建二级索引的方式实现数据的访问,由于索引的更新会降低数据流人速率,以稀疏数据为过滤条件对含有日志信息的表执行查询时,将会进行全表扫描,导致访问速度非常慢。
发明内容
针对上述技术问题,本发明提供一种稀疏数据的访问方法及***,采用了对稀疏列进行标记的方式,并且不需要二级索引,直接使用基本表,可以在持续数据输入的情况下,高效地对数据进行过滤读取。
为解决上述技术问题,本发明提供的技术方案是:
第一方面,本发明提供一种稀疏数据的访问方法,包括:
步骤S1,在数据库中对数据建立事实表时,创建稀疏矩阵,所述稀疏矩阵由多个稀疏列组成;
步骤S2,在所述稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列,并将所述被标记的稀疏列作为主键的第一列;
步骤S3,获取查询条件,根据所述查询条件在所述事实表中进行稀疏列的查询:
当所述查询条件中对应的稀疏列为有效数据,将所述查询条件中对应的稀疏列作为限定查询条件;
当所述查询条件中对应的稀疏列为无效数据,重新返回所述步骤S1;
步骤S4,根据所述查询条件和所述限定查询条件,实现所述查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问方法,其技术方案为:在数据库中对数据建立事实表时,创建稀疏矩阵,所述稀疏矩阵由多个稀疏列组成;在所述稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列,并将所述被标记的稀疏列作为主键的第一列;获取查询条件,根据所述查询条件在所述事实表中进行稀疏列的查询:当所述查询条件中对应的稀疏列为有效数据,将所述查询条件中对应的稀疏列作为限定查询条件;当所述查询条件中对应的稀疏列为无效数据,重新返回所述步骤S1;根据所述查询条件和所述限定查询条件,实现所述查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问方法,采用了对稀疏列进行标记的方式,并且不需要二级索引,直接使用基本表,可以在持续数据输入的情况下,高效地对数据进行过滤读取。
进一步地,在所述数据库中进行数据访问的过程中,通过固定大小的值为null的数据类型保存所述被标记的稀疏列,所述被标记的稀疏列对应的固定类型的值不大于null值。
进一步地,在所述数据库中进行数据访问的过程中,通过可变长度字符串数据类型保存固定类型的值大于所述null值的数据。
进一步地,所述步骤S3中,当所述查询条件中对应的稀疏列不包含所述被标记的稀疏列时,通过编译器给出警告提示。
第二方面,本发明提供了一种稀疏数据的访问***,包括:
稀疏矩阵创建模块,用于在数据库中对数据建立事实表时,创建稀疏矩阵,所述稀疏矩阵由多个稀疏列组成;
稀疏列标记模块,用于在所述稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列,并将所述被标记的稀疏列作为主键的第一列;
稀疏列查询模块,用于获取查询条件,根据所述查询条件在所述事实表中进行稀疏列的查询:
当所述查询条件中对应的稀疏列为有效数据,将所述查询条件中对应的稀疏列作为限定查询条件;
当所述查询条件中对应的稀疏列为无效数据,重新返回所述稀疏矩阵创建模块;
稀疏数据访问模块,用于根据所述查询条件和所述限定查询条件,实现所述查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问***,其技术方案为:通过稀疏矩阵创建模块,在数据库中对数据建立事实表时,创建稀疏矩阵,所述稀疏矩阵由多个稀疏列组成;通过稀疏列标记模块,在所述稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列,并将所述被标记的稀疏列作为主键的第一列;通过稀疏列查询模块,用于获取查询条件,根据所述查询条件在所述事实表中进行稀疏列的查询:当所述查询条件中对应的稀疏列为有效数据,将所述查询条件中对应的稀疏列作为限定查询条件;当所述查询条件中对应的稀疏列为无效数据,重新返回所述稀疏矩阵创建模块;通过稀疏数据访问模块,根据所述查询条件和所述限定查询条件,实现所述查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问***,采用了对稀疏列进行标记的方式,并且不需要二级索引,直接使用基本表,可以在持续数据输入的情况下,高效地对数据进行过滤读取。
进一步地,还包括数据存储模块,用于在所述数据库中进行数据访问的过程中,通过固定大小的值为null的数据类型保存所述被标记的稀疏列,所述被标记的稀疏列对应的固定类型的值不大于null值。
进一步地,所述数据存储模块,用于在所述数据库中进行数据访问的过程中,通过可变长度字符串数据类型保存固定类型的值大于所述null值的数据。
进一步地,所述稀疏列查询模块中,当所述查询条件中对应的稀疏列不包含所述被标记的稀疏列时,通过编译器给出警告提示。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍。
图1示出了本发明实施例所提供的一种稀疏数据的访问方法的流程图;
图2示出了本发明实施例所提供的一种稀疏数据的访问***的示意图。
具体实施方式
下面将结合附图对本发明技术方案的实施例进行详细的描述。以下实施例仅用于更加清楚地说明本发明的技术方案,因此只是作为示例,而不能以此来限制本发明的保护范围。
实施例一
图1示出了本发明实施例所提供的一种稀疏数据的访问方法的流程图;如图1所示,实施例一提供的一种稀疏数据的访问方法,包括:
步骤S1,在数据库中对数据建立事实表时,创建稀疏矩阵,稀疏矩阵由多个稀疏列组成;
步骤S2,在稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列_HAS_SPARSE_DATA_CHAR(1),并将被标记的稀疏列作为主键的第一列;如果定义了_SALT_和_DIVISION_BY_则放在它们之后。
本实施例中,假设数据存储时是按主键(或由多列组成的主键)来排序的,而且数据库具备像Trafodion MDAM(多维访问方法)的特性。关于这一特性的大体描述如下:
假设表T有4列:A,B,C,D,主键由两列(A,B)组成,MDAM将保证对于如下查询:
SELECT*FROM T WHERE B=3;
如果列A中数据的基数cardinality不是特别高的话,生成的查询条件会在B=3的行对A的所有可能的值做随机访问,而不是进行全表扫描,因为A并不是查询条件。这在没有MDAM时,是会进行全表扫描的。将被标记的稀疏列作为主键的第一列,可在数据访问时,首先对主键的第一列进行访问,加快了的访问速度。
需要说明的是,本方法并不一定需要数据库具备像MDAM这样的特性。例如,如果存储层使用的是ORC格式,则本方法可以充分利用其谓语下推和列数据有序的特性。
步骤S3,获取查询条件,根据查询条件在事实表中进行稀疏列的查询:
当查询条件中对应的稀疏列为有效数据,即查询条件中对应的稀疏列中的数据有效,不是not null,换句话说,查询条件中包含被标记的稀疏列时,将查询条件中对应的稀疏列作为限定查询条件;
当查询条件中对应的稀疏列为无效数据,即查询条件中对应的稀疏列中没有有效数据,换句话说,查询条件中不包含被标记的稀疏列时,重新返回步骤S1;
步骤S4,根据查询条件和限定查询条件,实现查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问方法,其技术方案为:在数据库中对数据建立事实表时,创建稀疏矩阵,稀疏矩阵由多个稀疏列组成;在稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列,并将被标记的稀疏列作为主键的第一列;获取查询条件,根据查询条件在事实表中进行稀疏列的查询:当查询条件中对应的稀疏列为有效数据,将查询条件中对应的稀疏列作为限定查询条件;当查询条件中对应的稀疏列为无效数据,重新返回步骤S1;根据查询条件和限定查询条件,实现查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问方法,采用了对稀疏列进行标记的方式,并且不需要二级索引,直接使用基本表,可以在持续数据输入的情况下,高效地对数据进行过滤读取。
其中,步骤S3,具体为:
当输入的一行数据,即查询条件中对应的稀疏列数据,当该数据在稀疏列上的值是有效数据(not null),则将这一行的_HAS_SPARSE_DATA_设为‘T’,否则设为‘F’;即查询条件中对应的稀疏列为被标记的稀疏列时,限定查询条件为“T”,否则为“F”。
需要说明的是,采用这种方式,只需要T/F两种取值,这样可以保证_HAS_SPARSE_DATA_的基数cardinality始终为2。而不需要用特殊的编码技术,比如比特位图等技术来表示表的哪一列有值,仅仅用T表示某个稀疏列上有值即可。采用特殊编码往往会适得其反,因为会增加此列的基数(cardinality)从而影响MDAM多维存取存储器。另外,采用比特位图这类位运算,无法转换为范围表达式,而采用T/F两种布尔值的表示方法已经足够,可以根据数据是否存在稀疏列上有值进行不同的分区。
通过上述限定查询条件的设置,当查询语句的条件中包含被标记的稀疏列时,自动在查询条件中加入AND_HAS_SPARSE_DATA_=‘T’。此时数据库仅访问_HAS_SPARSE_DATA_=‘T’的行,也就是稀疏列中包含有效数据的行,无需进行多行扫描,因此可以快速响应,对并行处理和查询整个数据集的要求相当低。
优选地,在数据库中进行数据访问的过程中,通过固定大小的值为null的数据类型保存被标记的稀疏列,被标记的稀疏列对应的固定类型的值不大于null值。
使用固定大小的值可为null的数据类型来保存稀疏数据,而不使用VARCHAR可变长度字符串这种数据类型。
例如。对于TIMESTAMP(6)类型,稀疏数据依然占用7字节,因为TIMESTAMP(6)在数据库中占有固定大小的空间,7字节。然而空的VARCHAR并不占用字节。在数据库中,行的大小与扫描表的性能息息相关,所以固定大小的稀疏数据可以被转换为字符串,VARCHAR,然后再转换回来。对于稀疏数据,这样可以大量节省存储空间,并提高访问的效率。
优选地,在数据库中进行数据访问的过程中,通过可变长度字符串数据类型保存固定类型的值大于null值的数据。
而对于数据的固定类型的大小大于null VARCHAR,即固定大小的值可为null的数据类型,则后台程序将底层存储类型改为VARCHAR。
优选地,步骤S3中,当查询条件中对应的稀疏列不包含被标记的稀疏列时,通过编译器给出警告提示。
通过编译器给出的警告提示,可及时提醒用户。
优选地,本实施例中的稀疏数据的访问方法的设计和实现如果完全由应用程序实现会非常繁琐。于是我们将上面的操作写到DBMS后台,让这些操作对使用者透明。
第二方面,图2示出了本发明实施例所提供的一种稀疏数据的访问***的示意图,参见图2,本实施例提供了一种稀疏数据的访问***10,包括:
稀疏矩阵创建模块101,用于在数据库中对数据建立事实表时,创建稀疏矩阵,稀疏矩阵由多个稀疏列组成;
稀疏列标记模块102,用于在稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列_HAS_SPARSE_DATA_CHAR(1),并将被标记的稀疏列作为主键的第一列;如果定义了_SALT_和_DIVISION_BY_则放在它们之后。
本实施例中,假设数据存储时是按主键(或由多列组成的主键)来排序的,而且数据库具备像Trafodion MDAM(多维访问方法)的特性。关于这一特性的大体描述如下:
假设表T有4列:A,B,C,D,主键由两列(A,B)组成,MDAM将保证对于如下查询:
SELECT*FROM T WHERE B=3;
如果列A中数据的基数cardinality不是特别高的话,生成的查询条件会在B=3的行对A的所有可能的值做随机访问,而不是进行全表扫描,因为A并不是查询条件。这在没有MDAM时,是会进行全表扫描的。将被标记的稀疏列作为主键的第一列,可在数据访问时,首先对主键的第一列进行访问,加快了的访问速度。
需要说明的是,本方法并不一定需要数据库具备像MDAM这样的特性。例如,如果存储层使用的是ORC格式,则本方法可以充分利用其谓语下推和列数据有序的特性。
稀疏列查询模块103,用于获取查询条件,根据查询条件在事实表中进行稀疏列的查询:
当查询条件中对应的稀疏列为有效数据,即查询条件中对应的稀疏列中的数据有效,不是not null,将查询条件中对应的稀疏列作为限定查询条件;
当查询条件中对应的稀疏列为无效数据,即查询条件中对应的稀疏列中没有有效数据,重新返回稀疏矩阵创建模块;
稀疏数据访问模块104,用于根据查询条件和限定查询条件,实现查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问***10,其技术方案为:通过稀疏矩阵创建模块101,在数据库中对数据建立事实表时,创建稀疏矩阵,稀疏矩阵由多个稀疏列组成;通过稀疏列标记模块102,在稀疏矩阵中至少对一个稀疏列进行标记,得到被标记的稀疏列,并将被标记的稀疏列作为主键的第一列;通过稀疏列查询模块103,用于获取查询条件,根据查询条件在事实表中进行稀疏列的查询:当查询条件中对应的稀疏列为被标记的稀疏列,将被标记的稀疏列作为限定查询条件;当查询条件中对应的稀疏列不包含被标记的稀疏列,重新返回稀疏矩阵创建模块;通过稀疏数据访问模块104,根据查询条件和限定查询条件,实现查询条件中对应的稀疏列所对应数据的访问。
本发明提供的稀疏数据的访问***10,采用了对稀疏列进行标记的方式,并且不需要二级索引,直接使用基本表,可以在持续数据输入的情况下,高效地对数据进行过滤读取。
其中,步骤S3,具体为:
当输入的一行数据,即查询条件中对应的稀疏列数据,当该数据在稀疏列上的值是有效数据(not null),则将这一行的_HAS_SPARSE_DATA_设为‘T’,否则设为‘F’;即查询条件中对应的稀疏列为被标记的稀疏列时,限定查询条件为“T”,否则为“F”。
需要说明的是,采用这种方式,只需要T/F两种取值,这样可以保证_HAS_SPARSE_DATA_的基数cardinality始终为2。而不需要用特殊的编码技术,比如比特位图等技术来表示表的哪一列有值,仅仅用T表示某个稀疏列上有值即可。采用特殊编码往往会适得其反,因为会增加此列的基数(cardinality)从而影响MDAM多维存取存储器。另外,采用比特位图这类位运算,无法转换为范围表达式,而采用T/F两种布尔值的表示方法已经足够,可以根据数据是否存在稀疏列上有值进行不同的分区。
通过上述限定查询条件的设置,当查询语句的条件中包含被标记的稀疏列时,自动在查询条件中加入AND_HAS_SPARSE_DATA_=‘T’。此时数据库仅访问_HAS_SPARSE_DATA_=‘T’的行,也就是稀疏列中包含有效数据的行,无需进行多行扫描,因此可以快速响应,对并行处理和查询整个数据集的要求相当低。
优选地,还包括数据存储模块,用于在数据库中进行数据访问的过程中,通过固定大小的值为null的数据类型保存被标记的稀疏列,被标记的稀疏列对应的固定类型的值不大于null值。
使用固定大小的值可为null的数据类型来保存稀疏数据,而不使用VARCHAR可变长度字符串这种数据类型。
例如:对于TIMESTAMP(6)类型,稀疏数据依然占用7字节,因为TIMESTAMP(6)在数据库中占有固定大小的空间,7字节。然而空的VARCHAR并不占用字节。在数据库中,行的大小与扫描表的性能息息相关,所以固定大小的稀疏数据可以被转换为字符串,VARCHAR,然后再转换回来。对于稀疏数据,这样可以大量节省存储空间,并提高访问的效率。
优选地,数据存储模块,用于在数据库中进行数据访问的过程中,通过可变长度字符串数据类型保存固定类型的值大于null值的数据。
而对于数据的固定类型的大小大于null VARCHAR,即固定大小的值可为null的数据类型,则后台程序将底层存储类型改为VARCHAR。
优选地,稀疏列查询模块103中,当查询条件中对应的稀疏列不包含被标记的稀疏列时,通过编译器给出警告提示。
通过编译器给出的警告提示,可及时提醒用户。
优选地,本实施例中的稀疏数据的访问方法的设计和实现如果完全由应用程序实现会非常繁琐。于是我们将上面的操作写到DBMS后台,让这些操作对使用者透明。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。