一种多表关联查询方法、装置及设备
技术领域
本申请涉及计算机技术领域,尤其涉及一种多表关联查询方法、装置及设备。
背景技术
现有技术中,用户的数据会以多张表的方式存储在数据库中。为了查询用户的某些行为,需要进行多表关联查询。多表关联查询,通常是指从多个数据表中查询具有某些共同属性的记录。
例如,假设有表A、表B和表C三个数据表。其中,表A存储有用户编号和用户姓名,表B存储有用户编号和用户年龄,表C存储有用户编号和用户性别。每个用户具有一个唯一的编号。那么,如果要查询姓名为“张三”,年龄为20岁的男性,就需要根据这三个表进行多表关联查询,才能够得到查询结果。
但是,现有的多表关联查询方法,通常是将多表关联查询脚本中涉及到的每个数据表的查询结果,分别获取到查询发起设备的内存中,再对每个数据表的查询结果进行过滤。这种方式进行多表查询,效率较低。
发明内容
有鉴于此,本申请实施例提供了一种多表关联查询方法、装置及设备,用于提高查询效率。
为解决上述技术问题,本说明书实施例是这样实现的:
本说明书实施例提供的一种多表关联查询方法,包括:
获取针对第一表格的第一查询语句;所述第一查询语句是对多表关联查询脚本进行解析得到的;
获取针对第二表格的第二查询语句;所述第二查询语句是对所述多表关联查询脚本进行解析得到的;所述第一查询语句与所述第二查询语句中的查询条件具有相同的字段;
估算所述第一查询语句的第一查询代价;
估算所述第二查询语句的第二查询代价;
比较所述第一查询代价与所述第二查询代价,确定最小查询代价;
根据所述最小查询代价对应的查询语句进行查询,得到第一查询结果集;
根据所述第一查询结果集,改写另外的查询语句;
根据所述改写后的查询语句进行查询,得到第二查询结果集;
根据所述第一查询结果集与所述第二查询结果集,得到关联查询结果集。
本说明书实施例提供的一种多表关联查询装置,包括:
第一查询语句获取模块,用于获取针对第一表格的第一查询语句;所述第一查询语句是对多表关联查询脚本进行解析得到的;
第二查询语句获取模块,用于获取针对第二表格的第二查询语句;所述第二查询语句是对所述多表关联查询脚本进行解析得到的;所述第一查询语句与所述第二查询语句中的查询条件具有相同的字段;
第一查询代价估算模块,用于估算所述第一查询语句的第一查询代价;
第二查询代价估算模块,用于估算所述第二查询语句的第二查询代价;
查询代价比较模块,用于比较所述第一查询代价与所述第二查询代价,确定最小查询代价;
第一查询模块,用于根据所述最小查询代价对应的查询语句进行查询,得到第一查询结果集;
查询语句改写模块,用于根据所述第一查询结果集,改写另外的查询语句;
第二查询模块,用于根据所述改写后的查询语句进行查询,得到第二查询结果集;
关联结果生成模块,用于根据所述第一查询结果集与所述第二查询结果集,得到关联查询结果集。
本说明书实施例提供的一种设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
获取针对第一表格的第一查询语句;所述第一查询语句是对多表关联查询脚本进行解析得到的;
获取针对第二表格的第二查询语句;所述第二查询语句是对所述多表关联查询脚本进行解析得到的;所述第一查询语句与所述第二查询语句中的查询条件具有相同的字段;
估算所述第一查询语句的第一查询代价;
估算所述第二查询语句的第二查询代价;
比较所述第一查询代价与所述第二查询代价,确定最小查询代价;
根据所述最小查询代价对应的查询语句进行查询,得到第一查询结果集;
根据所述第一查询结果集,改写另外的查询语句;
根据所述改写后的查询语句进行查询,得到第二查询结果集;
根据所述第一查询结果集与所述第二查询结果集,得到关联查询结果集。
本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:
通过对各个表格的查询代价进行估算,先执行查询代价较小的查询语句,再根据得到的查询结果集,对另外的查询语句进行改写,从而可以缩小另外的查询语句的查询范围,减小另外的查询语句的查询代价,进而提高多表关联查询的查询效率。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本说明书实施例中多表关联查询方法的一种应用场景的示意图;
图2为本说明书实施例提供的一种多表关联查询方法的流程示意图;
图3为本说明书实施例提供的对应于图2的一种多表关联查询装置的结构示意图;
图4为本说明书实施例提供的对应于图2的一种多表关联查询设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为本说明书实施例中多表关联查询方法的一种应用场景的示意图。如图1所示,工作站10与数据库11、数据库12、数据库13之间可通信连接。数据库11、数据库12与数据库13分别存储有大量的数据表。数据库11、数据库12与数据库13可以分别位于不同的地点。数据库11、数据库12与数据库13也可以是不同类型的数据库。当工作站10获取到多表关联查询脚本,并且脚本中涉及到的表分别位于数据库11、数据库12与数据库13中时,需要分别从数据库11、数据库12与数据库13获取相关的数据信息。
图2为本说明书实施例提供的一种多表关联查询方法的流程示意图。从程序角度而言,流程的执行主体可以为搭载于应用服务器或工作站计算机的程序或应用客户端。
如图2所示,该流程可以包括以下步骤:
S201:获取针对第一表格的第一查询语句;所述第一查询语句是对多表关联查询脚本进行解析得到的;
所述多表关联查询脚本,可以是采用SQL语句的脚本。
本说明书实施例中的第一表格,可以是数据库中存储的数据表。
可以采用开源软件对多表关联查询脚本解析,得到针对各个表格的查询语句。
S202:获取针对第二表格的第二查询语句;所述第二查询语句是对所述多表关联查询脚本进行解析得到的;所述第一查询语句与所述第二查询语句中的查询条件具有相同的字段;
例如,下面是一段简单的多表关联查询脚本:
上面的一段脚本中,涉及表格a和表格b。可以采用开源软件对该脚本解析,得到针对表格a的查询语句,以及针对表格b的查询语句。
针对表格a的查询语句可以是
针对表格a的查询语句可以是
可以看出,针对表格a的查询语句与针对表格b的查询语句中的查询条件具有相同的字段id。
S203:估算所述第一查询语句的第一查询代价;
查询代价,可以是指执行查询所消耗的时间或者占用的硬件资源的多少。本说明书实施例中,可以从查询结果的数据量的角度估算查询代价,也可以从数据表格中元数据的数据量的角度估算查询代价,还可以按照查询结果的数据量,内存的占用率,CPU的占用率三者综合考虑的方式估算查询代价。
可以采用动态规划算法、遗传算法结合数据库元数据估算查询代价。
S204:估算所述第二查询语句的第二查询代价;
S205:比较所述第一查询代价与所述第二查询代价,确定最小查询代价;
查询代价的结果可以是具体数值。比较具体数值的大小,可以确定最小查询代价。
S206:根据所述最小查询代价对应的查询语句进行查询,得到第一查询结果集;
对于查询代价最小的查询语句,可以先进行查询。
S207:根据所述第一查询结果集,改写另外的查询语句;
可以用所述第一查询结果集作为新增加的限制条件,对另外的查询语句增加限定条件。
当第一查询语句的查询代价最小时,所述另外的查询语句是第二查询语句;当第二查询语句的查询代价最小时,所述另外的查询语句是第一查询语句。
S208:根据所述改写后的查询语句进行查询,得到第二查询结果集;
由于改写后的查询语句的限制条件增加了,所以第二查询结果集的数据量,小于改写前的查询语句的查询结果。
S209:根据所述第一查询结果集与所述第二查询结果集,得到关联查询结果集。
具体的,可以通过连接算法将所述第一查询结果集与所述第二查询结果集进行连接,得到最终的关联查询结果集。
在上面给出的查询语句的例子中,假设针对表格a的查询语句的查询代价是100(表示预计查询结果为100条),针对表格b的查询语句的查询代价是1000(表示预计查询结果为1000条),则可以先执行针对表格a的查询语句。假设执行后得到结果集为D(A)={id}={1,2,3,..100},则可以据此将针对表格b的查询语句改写为select b.age,b.sex fromB b where b.aid in(1,2,3,...100)and b.age>20and b.sex='male'。改写后,意味着针对表格b的查询语句只需要从id为1到100之间的数据进行查询,缩小了查询范围,并且对于表格b的查询结果也会在100以内。相较于改写之前的查询代价,改写后的查询语句的查询代价变小了。更具体的,改写之前,在执行对于表格b的查询语句时,工作站的设备需要从数据库中读取1000条左右的数据到自身的内存中,再从这1000条左右的数据中过滤与表格a相关的数据,才能够得到最终的100条以内的数据。改写后,工作站的设备只需要从数据库中读取100条以内的数据到自身的内存中,再将这100条以内的数据与表格a的查询结果集进行连接即可。
综上所述,图2中的方法,通过对各个表格的查询代价进行估算,先执行查询代价较小的查询语句,再根据得到的查询结果集,对另外的查询语句进行改写,从而可以缩小另外的查询语句的查询范围,减小另外的查询语句的查询代价,进而提高多表关联查询的查询效率。
基于图2的方法,本说明书实施例还提供了该方法的一些具体实施方案,下面进行说明。
本说明书实施例中,步骤S207:根据所述第一查询结果集,改写另外的查询语句,具体可以包括:
将所述另外的查询语句中的所述相同的字段,用所述第一查询结果集的值进行限定。
实际应用中,当某个数据表格的数据量很大时,对于该表格的查询代价的估算也会消耗大量的资源。当数据量超过一定数值时,估算对于该表格的查询代价,会引起数据库的崩溃。为了避免这种情况的发生,本说明书实施例中,步骤S203:估算所述第一查询语句的第一查询代价之前,还可以包括以下步骤:
判断所述第一表格的数据量是否大于预设阈值,得到第一判断结果;
所述估算所述第一查询语句的第一查询代价,具体为:
当所述第一判断结果表示所述第一表格的数据量不大于所述预设阈值时,估算所述第一查询语句的第一查询代价。
当所述第一判断结果表示所述第一表格的数据量大于所述预设阈值时,可以不再执行估算所述第一查询语句的第一查询代价的步骤。
上述步骤中,所述预设阈值的具体数值可以根据数据库的性能进行设置。
当所述第一判断结果表示所述第一表格的数据量不大于所述预设阈值时,估算所述第一查询语句的第一查询代价,不会引起数据库的崩溃。
当所述第一判断结果表示所述第一表格的数据量大于所述预设阈值时,可以不再估算所述第一查询语句的第一查询代价,直接执行以下步骤:
根据所述第一查询语句进行查询,得到第三查询结果集;
根据所述第二查询语句进行查询,得到第四查询结果集;
根据所述第三查询结果集与所述第四查询结果集,得到关联查询结果集。
上述步骤,不再对查询语句进行改写,直接采用原始的第一查询语句与第二查询语句进行查询,从而避免引起数据库的崩溃。
上面的例子中,针对的是对两个表格进行的多表关联查询。实际应用中,还可以对三个表格或更多表格进行多表关联查询。
若对三个表格进行多表关联查询,可以采用以下步骤:
获取针对第三表格的第三查询语句;所述第三查询语句中的查询条件具有所述相同的字段;
计算所述第三查询语句的第三查询代价;
上述步骤S205确定最小查询代价之后,步骤S206根据所述最小查询代价对应的查询语句进行查询之前,还可以包括:
比较所述第三查询代价与所述最小查询代价;
若所述第三查询代价小于所述最小查询代价,则根据所述第三查询语句进行查询,得到第五查询结果集;
根据所述第五查询结果集,改写所述最小查询代价对应的查询语句;
步骤S206根据所述最小查询代价对应的查询语句进行查询,具体可以包括:
根据改写后的所述最小查询代价对应的查询语句进行查询。
上述步骤中,当涉及三个表格时,可以分别对三个表格的查询代价进行估算,从三个估算结果中选取查询代价最小的表格,先进行查询。得到查询结果后,再根据查询结果对查询代价居中的表格的查询语句进行改写。得到第二个表格的查询结果后,再根据第二个表格的查询结果,对第三个表格的查询语句进行改写,而后查询,从而实现对于三个表格的多表关联查询的语句优化。
更进一步的,由上例中三个表格的查询方式,可以知道,当有更多表格需要进行关联查询时,可以对各个表格的查询代价进行估算,根据估算得到的查询代价的大小进行从小到大的排序,先对查询代价最小的表格进行查询,再根据查询结果改写查询代价次小的查询语句,依次进行查询和改写,直至得到查询语句被改写后的各个表格的查询结果。
实际应用中,对于查询语句的执行过程是循环进行的。有时当数据表中的数据已经全部被查询过一遍后,由于查询过程还在循环进行,有可能导致***还在进行循环查询,浪费查询时间。
为了避免上面的情况发生,本说明书实施例中,根据所述最小查询代价对应的查询语句进行查询之后,还可以包括步骤:
将所述最小查询代价对应的查询语句针对的表格的状态标记为已查询。
同理,本说明书实施例中,根据所述改写后的查询语句进行查询之后,还可以包括步骤:
将所述改写后的查询语句针对的表格的状态标记为已查询。
表格的状态为已查询,表示该表格已查询完毕,后续进程识别出该状态标记后,可以不再进行对于该表格的循环查询。
实际应用中,每个查询结果集中可以包含多条查询数据,各个查询结果集进行关联可以得到最终的关联查询结果集。具体的关联方式,可以采用外连接的方式进行。外连接包括,左连接与右连接。具体采用何种外连接的方式,是由最初的多表关联查询脚本决定的。最初的多表关联查询脚本中,可以用left join表示左连接,right join表示右连接。
还需要说明的是,本说明书实施例中的第一查询语句,第二查询语句等,是由最初的多表关联查询脚本进行解析得到的。也就是说,获取针对第一表格的第一查询语句之前,还可以包括以下步骤:
获取多表关联查询脚本;
解析所述脚本,得到所述第一查询语句与所述第二查询语句。
可以采用Jsqlparser或druid等开源软件实现对于多表关联查询脚本的解析。
基于同样的思路,本说明书实施例还提供了上述方法对应的装置。图3为本说明书实施例提供的对应于图2的一种多表关联查询装置的结构示意图。如图3所示,该装置可以包括:
第一查询语句获取模块301,用于获取针对第一表格的第一查询语句;所述第一查询语句是对多表关联查询脚本进行解析得到的;
第二查询语句获取模块302,用于获取针对第二表格的第二查询语句;所述第二查询语句是对所述多表关联查询脚本进行解析得到的;所述第一查询语句与所述第二查询语句中的查询条件具有相同的字段;
第一查询代价估算模块303,用于估算所述第一查询语句的第一查询代价;
第二查询代价估算模块304,用于估算所述第二查询语句的第二查询代价;
查询代价比较模块305,用于比较所述第一查询代价与所述第二查询代价,确定最小查询代价;
第一查询模块306,用于根据所述最小查询代价对应的查询语句进行查询,得到第一查询结果集;
查询语句改写模块307,用于根据所述第一查询结果集,改写另外的查询语句;
第二查询模块308,用于根据所述改写后的查询语句进行查询,得到第二查询结果集;
关联结果生成模块309,用于根据所述第一查询结果集与所述第二查询结果集,得到关联查询结果集。
可选的,所述查询语句改写模块307,具体可以包括:
查询语句改写单元,用于将所述另外的查询语句中的所述相同的字段,用所述第一查询结果集的值进行限定。
可选的,该装置还可以包括:
第一判断模块,用于在估算所述第一查询语句的第一查询代价之前,判断所述第一表格的数据量是否大于预设阈值,得到第一判断结果;
所述第一查询代价估算模块303,具体可以用于:
当所述第一判断结果表示所述第一表格的数据量不大于所述预设阈值时,估算所述第一查询语句的第一查询代价。
可选的,该装置,还可以包括:
第三查询模块,用于当所述第一判断结果表示所述第一表格的数据量大于所述预设阈值时,根据所述第一查询语句进行查询,得到第三查询结果集;
第四查询模块,用于根据所述第二查询语句进行查询,得到第四查询结果集;
所述关联结果生成模块309,还用于根据所述第三查询结果集与所述第四查询结果集,得到关联查询结果集。
可选的,该装置,还可以包括:
第三查询语句获取模块,用于获取针对第三表格的第三查询语句;所述第三查询语句中的查询条件具有所述相同的字段;
第三查询代价估算模块,用于估算所述第三查询语句的第三查询代价;
所述查询代价比较模块305,还用于在确定最小查询代价之后,所述根据所述最小查询代价对应的查询语句进行查询之前,比较所述第三查询代价与所述最小查询代价;
第四查询模块,用于若所述第三查询代价小于所述最小查询代价,则根据所述第三查询语句进行查询,得到第五查询结果集;
所述查询语句改写模块307,还用于根据所述第五查询结果集,改写所述最小查询代价对应的查询语句;
所述第一查询模块306,还用于:
根据改写后的所述最小查询代价对应的查询语句进行查询。
可选的,该装置还可以包括:
第一标记模块,用于根据所述最小查询代价对应的查询语句进行查询之后,将所述最小查询代价对应的查询语句针对的表格的状态标记为已查询。
可选的,该装置还可以包括:
第二标记模块,用于根据所述改写后的查询语句进行查询之后,将所述改写后的查询语句针对的表格的状态标记为已查询。
可选的,所述关联结果生成模块309,具体用于:
将所述第一查询结果集与所述第二查询结果集进行外连接,得到连接后的查询结果集。
可选的,该装置还可以包括:
查询脚本获取模块,用于在获取针对第一表格的第一查询语句之前,获取多表关联查询脚本;
脚本解析模块,用于解析所述脚本,得到所述第一查询语句与所述第二查询语句。
基于同样的思路,本说明书实施例还提供了上述方法对应的设备。
图4为本说明书实施例提供的对应于图2的一种多表关联查询设备的结构示意图。如图4所示,设备400可以包括:
至少一个处理器410;以及,
与所述至少一个处理器通信连接的存储器430;其中,
所述存储器430存储有可被所述至少一个处理器410执行的指令420,所述指令被所述至少一个处理器410执行,以使所述至少一个处理器410能够:
获取针对第一表格的第一查询语句;所述第一查询语句是对多表关联查询脚本进行解析得到的;
获取针对第二表格的第二查询语句;所述第二查询语句是对所述多表关联查询脚本进行解析得到的;所述第一查询语句与所述第二查询语句中的查询条件具有相同的字段;
估算所述第一查询语句的第一查询代价;
估算所述第二查询语句的第二查询代价;
比较所述第一查询代价与所述第二查询代价,确定最小查询代价;
根据所述最小查询代价对应的查询语句进行查询,得到第一查询结果集;
根据所述第一查询结果集,改写另外的查询语句;
根据所述改写后的查询语句进行查询,得到第二查询结果集;
根据所述第一查询结果集与所述第二查询结果集,得到关联查询结果集。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字***“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的***、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于***实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。