CN114003619A - 一种数据库查询的方法、装置、电子设备及存储介质 - Google Patents
一种数据库查询的方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN114003619A CN114003619A CN202111269575.XA CN202111269575A CN114003619A CN 114003619 A CN114003619 A CN 114003619A CN 202111269575 A CN202111269575 A CN 202111269575A CN 114003619 A CN114003619 A CN 114003619A
- Authority
- CN
- China
- Prior art keywords
- query
- condition
- database
- query condition
- query result
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24534—Query rewriting; Transformation
- G06F16/24539—Query rewriting; Transformation using cached or materialised query results
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例公开了一种数据库查询的方法、装置、电子设备及存储介质,包括:利用抽象语法树解析数据库查询语句,并按照单个字段维度将数据库查询语句拆分为查询子任务;针对每一个查询子任务,根据第一目标字段和第一查询条件判断已有的查询结果集是否可用;如果已有的查询结果集可用,则从缓存中获取查询子任务的数据库查询结果;否则,通过数据库获取查询子任务的数据库查询结果;将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果。应用本申请实施例方案,可以最大限度利用已有的查询结果,减少数据库访问的几率,提高数据库查询效率。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种数据库查询的方法,一种数据库查询的装置,一种电子设备,一种计算机可读存储介质,一种计算机程序产品。
背景技术
随着存储的数据量越来越大,可以采用海量数据的联机分析处理(OnlineAnalytical Processing,简称为OLAP)来查询数据。实际应用中,某些查询的字面含义不相同但实际相同时,现有技术无法直接利用已有的查询结果,需要重新查询数据库,导致数据库查询的效率低下。
发明内容
针对上述现有技术,本发明实施例公开一种数据库查询的方法,可以克服数据库查询效率低的缺陷,达到充分利用缓存中的数据库查询结果,提高数据库查询效率的目的。
本申请实施例中的一种数据库查询的方法具体为:
利用抽象语法树解析数据库查询语句,并按照单个字段维度将所述数据库查询语句拆分为查询子任务,每一个所述查询子任务包括第一目标字段和第一查询条件,所述第一目标字段表示需要查询的单个字段,所述第一查询条件表示查询所述第一目标字段时的筛选条件,所述筛选条件包括字段名、运算符和运算数;
针对每一个所述查询子任务,根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用,所述已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存中;如果所述已有的查询结果集可用,则从所述缓存中获取所述查询子任务的数据库查询结果;否则,通过数据库获取所述查询子任务的数据库查询结果;
将所有的所述查询子任务的数据库查询结果进行合并,作为所述数据库查询语句的查询结果。
进一步地,所述根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用的步骤包括:
将所述已有的查询结果集中的一个查询结果子集作为第一查询结果子集,将所述第一查询结果子集对应的字段作为第二目标字段,将所述第一查询结果子集对应的查询条件作为第二查询条件;
将所述查询子任务中的所述第一目标字段和所述第一查询结果子集对应的所述第二目标字段进行比较,如果相同,则继续执行后续步骤;否则确定所述第一查询结果子集不可用,将下一个查询结果子集作为新的第一查询结果子集,并返回到所述将所述查询子任务中的所述第一目标字段和所述第一查询结果子集对应的所述第二目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集,结束所述根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用的步骤;
判断所述查询子任务中的所述第一查询条件是否包含于所述第一查询结果子集对应的第二查询条件中,如果是,则确定所述第一查询结果子集可用;否则,确定所述第一查询结果子集不可用,将下一个查询结果子集作为新的第一查询结果子集,并返回到所述将所述查询子任务中的所述第一目标字段和所述第一查询结果子集对应的所述第二目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集。
进一步地,所述判断查询子任务中的所述第一查询条件是否包含于所述第一查询结果子集对应的第二查询条件中的步骤包括:
判断所述第一查询条件的个数与所述第二查询条件的个数是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
判断所述第一查询条件所包括的字段名与所述第二查询条件所包括的字段名是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
将所述第一查询条件中所述第一目标字段所属的查询条件作为第三查询条件,将所述第一查询条件中的其他查询条件作为第四查询条件;将所述第二查询条件中所述第二目标字段所属的查询条件作为第五查询条件,将所述第二查询条件中的其他查询条件作为第六查询条件;所述第三查询条件中的字段名与所述第五查询条件中的字段名相同;
判断所述第四查询条件与所述第六查询条件是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
判断所述第三查询条件中的运算符与所述第五查询条件中的运算符是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
判断所述第三查询条件中的运算数是否包含于所述第五查询条件中,如果是,则所述第一查询条件包含于所述第二查询条件中;否则,确定所述第一查询条件未包含于所述第二查询条件中。
进一步地,所述判断所述第三查询条件中的运算数是否包含于所述第五查询条件中的步骤包括:
如果所述第三查询条件中的运算符为“>”或“>=”,那么所述第三查询条件中的运算数小于所述第五查询条件中的运算数时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“<”或“<=”,那么所述第三查询条件中的运算数大于所述第五查询条件中的运算数时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“==”或“<>”,那么所述第三查询条件中的运算数不等于所述第五查询条件中的运算数时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“BETWEEN”,那么所述第三查询条件中的运算数的取值范围大于所述第五查询条件中的运算数的取值范围时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“like”,那么所述第三查询条件中的运算数的取值范围大于所述第五查询条件中的运算数的取值范围时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中。
进一步地,所述将所有的所述查询子任务的数据库查询结果进行合并,作为所述数据库查询语句的查询结果的步骤之后,该方法进一步包括:
判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并,如果可以合并,则将所述数据库查询语句的查询结果与所述已有的查询结果集合并;否则,将所述数据库查询语句的查询结果按照一个字段对应一个查询结果子集的方式保存在缓存中。
进一步地,所述判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并的步骤包括:
将所述数据库查询语句的查询结果按照单个字段维度拆分为待保存查询结果子集,每个所述待保存查询结果子集对应的字段为第七目标字段,每个所述待保存查询结果子集对应的查询条件为第七查询条件;
将所述已有的查询结果集中的一个查询结果子集作为第二查询结果子集,将所述第二查询结果子集对应的字段作为第八目标字段,将所述第二查询结果子集对应的查询条件作为第二查询条件;
将所述第二查询结果子集对应的所述第二目标字段与所述待保存查询结果子集对应的第七目标字段进行比较,如果相同,则继续执行后续步骤;否则确定所述第二查询结果子集不可合并,将下一个查询结果子集作为新的第二查询结果子集,并返回到所述将所述第二查询结果子集对应的所述第八目标字段与所述待保存查询结果子集对应的第七目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集,结束所述判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并的步骤;
判断所述待保存查询结果子集中的所述第七查询条件与所述第二查询结果子集对应的第八查询条件是否可以合并,如果可以合并,则确定所述第二查询结果子集可以合并;否则,确定所述第二查询结果子集不可合并,将下一个查询结果子集作为新的第二查询结果子集,并返回到所述将所述第二查询结果子集对应的所述第八目标字段与所述待保存查询结果子集对应的第七目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集。
本发明实施例还公开一种数据库查询的装置,可以克服数据库查询效率低的缺陷,达到充分利用缓存中的数据库查询结果,提高数据库查询效率的目的。
一种数据库查询的装置包括:
查询语句解析模块,利用抽象语法树解析数据库查询语句,并按照单个字段维度将所述数据库查询语句拆分为查询子任务,每一个所述查询子任务包括第一目标字段和第一查询条件,所述第一目标字段表示需要查询的单个字段,所述第一查询条件表示查询所述第一目标字段时的筛选条件,所述筛选条件包括字段名、运算符和运算数;
第一查询模块,针对每一个所述查询子任务,根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用,所述已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存中;如果所述已有的查询结果集可用,则从所述缓存中获取所述查询子任务的数据库查询结果;否则,通过数据库获取所述查询子任务的数据库查询结果;
第一合并模块,将所有的所述查询子任务的数据库查询结果进行合并,作为所述数据库查询语句的查询结果。
本申请实施例还公开一种计算机可读存储介质,其上存储有计算机指令,所述指令被处理器执行时可实现上述任一数据库查询的方法的步骤。
本申请实施例还公开一种数据可视化展示的电子设备,该电子设备包括:
处理器;
用于存储所述处理器可执行指令的存储器;
所述处理器,用于从所述存储器中读取所述可执行指令,并执行所述指令以实现上述任一的数据库查询的方法。
本申请实施例还公开一种计算机程序产品,包括计算机指令,所述计算机指令在被处理器执行时实施如上述任一所述的数据库查询的方法。
综上所述,本申请实施例方案将数据库查询语句按照单个字段维度进行拆分,拆分为查询子任务。同时,缓存中已有的数据库查询结果集按照第一个字段对应一个查询结果子集的方式保存。因此,每个查询子任务可以根据单个字段和查询条件判断已有的查询结果集是否可用,并在可用的情况直接从缓存中获取查询结果。由于查询子任务和缓存中已有的数据库查询结果集合的粒度都比较小,均是单个字段维度的,因此可以最大限度利用已有的查询结果,减少数据库访问的几率,提高数据库查询效率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实现数据库查询的方法实施例一的流程图。
图2是本申请实现数据库查询的方法实施例二的流程图。
图3是本申请实施例中利用抽象语法树表示的数据库查询语句的示例图。
图4是本申请方法实施例三实现步骤204的流程图。
图5是本申请方法实施例四实现步骤406的流程图。
图6是本申请实施例四的方法流程图。
图7是本申请方法实施例五实现步骤604的流程图。
图8是本申请实现数据库查询的装置实施例一的结构示意图。
图9是本申请实施例提供的一种实现上述各个实施例的系统结构示意图。
图10是本申请实施例中的电子设备结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其他步骤或单元。
下面以具体实施例对本发明的技术方案进行详细说明。下面几个具体实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
本申请实施例将已有的数据库查询结果按照字段维度保存在缓存中,当接收到新的数据库查询语句时,可以将数据库查询语句拆分为字段维度的查询子任务,并从缓存中查找是否存在可用的数据库查询结果,如果可用,则直接从缓存中获取查询结果,而无需查询数据库,从而增加已有的数据库查询结果集的利用率,并提高数据库查询的效率。
图1是本申请实现数据库查询的方法实施例一的流程图。如图1所示,该方法包括:
步骤101:利用抽象语法树解析数据库查询语句,并按照单个字段维度将数据库查询语句拆分为查询子任务,每一个查询子任务包括第一目标字段和第一查询条件,第一目标字段表示需要查询的单个字段,第一查询条件表示查询第一目标字段时的筛选条件,筛选条件包括字段名、运算符和运算数。
本申请实施例中,数据库主要是指关系型数据库,比如MYSQL、Oracle、DB2等等数据库。在需要面对海量数据时,数据库可以为联机分析处理(OLAP)数据库。数据库查询语句可以指SQL查询语句。SQL查询语句的解析过程是通过识别SQL语句的关键字,获取查询语句的语义。SQL语句的关键字包括SELECT、FROM、WHERE、AND等。其中,SELECT和FROM关键字之间为目标字段,WHERE之后的字符表示查询条件,目标字段和查询条件可以为多个。总之,按照SQL语句的逻辑,通过抽象语法树可以解析出数据库查询语句。
为了有效利用缓存中已有的查询结果集,本申请实施例将数据库查询语句按照单个字段维度进行拆分,拆分后的每个查询子任务仅包括一个目标字段和对应的查询条件。为了区分后续涉及的字段和查询条件,这里称为第一目标字段和第一查询条件。其中,第一查询条件包括字段名、运算符和运算数。
步骤102:针对每一个查询子任务,根据第一目标字段和第一查询条件判断已有的查询结果集是否可用,已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存中;如果已有的查询结果集可用,则执行步骤103;否则,执行步骤104。
步骤103:从缓存中获取查询子任务的数据库查询结果。
步骤104:通过数据库获取查询子任务的数据库查询结果。
上述步骤102~步骤104为执行查询子任务的步骤,即:先判断在缓存中的已有的查询结果集是否可用,如果可用,则直接从缓存中获取查询子任务的数据库查询结果,如果不可用,再从数据库中获取查询子任务的数据库查询结果。由于查询子任务中仅包括一个目标字段,而缓存中已有的查询结果集也是按照单个字段维度的方式保存,因此可以很方便地判断已有的查询结果是否可用。
步骤105:将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果。
完成所有的查询子任务之后,还需要将相应的数据库查询结果进行合并,将合并后的整体作为数据库查询语句的查询结果。
应用本申请实施例一的方案,由于将数据库查询语句按单个字段进行了拆分,已有的数据库查询结果集也按照单个字段拆分后保存在缓存中,因此可以很方便地判断缓存中的已有的查询结果集是否可用,避免字面含义不同但实际相同的查询语句无法利用已有的查询结果的缺陷,大大提高了数据库查询的效率。
为了更好地说明本申请方案,下面用其他实施例进行详细描述。
图2是本申请实现数据库查询的方法实施例二的流程图。如图2所示,该方法包括:
步骤201:利用抽象语法树解析数据库查询语句,并按照单个字段维度将数据库查询语句拆分为查询子任务,每一个所述查询子任务包括第一目标字段和第一查询条件,所述第一目标字段表示需要查询的单个字段,所述第一查询条件表示查询所述第一目标字段时的筛选条件,所述筛选条件包括字段名、运算符和运算数。
本步骤与方法实施例一中的步骤101相同。
假设某个SQL语句为“SELECT name,age FROM user info WHERE age>30AND sex=male”,其含义表示从数据库user info这个表中查询“name”和“age”两个字段的结果,查询条件是“age>30”和“sex=male”。图3是本申请实施例中利用抽象语法树表示的数据库查询语句的示例图。如图3所示,其中灰色节点表示语句的各关键字,叶子节点表示值,根据抽象语法树可以很容易将数据库查询语句进行拆分为两个查询子任务。拆分后的查询子任务可以表示为:①“SELECT name FROM user info WHERE age>30AND sex=male”;②“SELECTage FROM user info WHERE age>30AND sex=male”。这里,第一个查询子任务中仅包括需要查询的一个字段“name”,查询条件为“age>30”和“sex=male”。第二个查询子任务中也仅包括需要查询的一个字段“age”,查询条件仍然为“age>30”和“sex=male”。为了与后续的字段和查询条件区分开,这里称为第一目标字段和第一查询条件。即,在第一个查询子任务中,第一目标字段为“name”,第一查询条件为“age>30”和“sex=male”。在第二个查询子任务中,第一目标字段为“age”,第一查询条件为“age>30”和“sex=male”。
为了避免频繁地查询数据库,本申请实施例先判断缓存中已有的查询结果集是否可用。由于已经将数据库查询语句拆分为查询子任务,那么针对每一个查询子任务,就需要根据第一目标字段和第一查询条件判断已有的查询结果集是否可用,具体可按照如下步骤202~步骤204进行处理:
步骤202:将已有的查询结果集中的一个查询结果子集作为第一查询结果子集,将第一查询结果子集对应的字段作为第二目标字段,将第一查询结果子集对应的查询条件作为第二查询条件。
如方法实施例一所述,本申请实施例中的已有查询结果集是按照一个字段对应一个查询结果子集的方式保存在缓存中。假设此前的数据库查询过程中,已经查询到包括“name”、“occupation”、“telephone”共三个字段的查询结果集,查询结果集按照字段进行拆分后,包括“name”字段的查询结果子集、“occupation”字段的查询结果子集、“telephone”字段的查询结果子集,并分别保存在缓存中。每一个查询结果子集均有对应的查询条件,假设“name”字段对应的查询条件为“age>20”和“sex=male”;“occupation”字段对应的查询条件为“occupation=engineer”和“sex=male”;“telephone”字段对应的查询条件为“age>20”和“sex=female”。为了与后续其他字段和查询条件区别,这里将第一查询结果子集对应的字段称为第二目标字段,将第一查询结果子集对应的查询条件称为第二查询条件。
步骤203:将查询子任务中的第一目标字段和第一查询结果子集对应的第二目标字段进行比较,如果相同,则继续执行后续步骤204;否则确定第一查询结果子集不可用,将下一个查询结果子集作为新的第一查询结果子集,并返回到本步骤203,直到遍历完所有的所述查询结果子集,跳转到步骤205。
首先,如果缓存中的某个查询结果子集可用,其字段内容应该与查询子任务的第一目标字段一致。比如,查询子任务中的第一目标字段为“name”,其目的是需要查询内容为姓名的结果。如果某查询结果子集的字段也为“name”,其内容恰好为需要查询的内容,那么该查询结果子集可能可以为查询子任务提供查询结果。相反,如果某查询子集的字段为“occupation”,其内容为职业,必定无法为查询子任务提供关于姓名的内容,因此不可用。
本步骤按照上述方式对查询结果子集进行遍历,如果确定查询子任务中的第一目标字段和查询结果子集的第二目标字段相同,则利用后续步骤继续判断查询结果子集是否可以利用。如果遍历完所有的查询结果子集,均未确定相同的字段的查询结果子集,则说明缓存中已有的查询结果不可用。
步骤204:判断查询子任务中的第一查询条件是否包含于第一查询结果子集对应的第二查询条件中,如果是,则确定第一查询结果子集可用;否则,确定第一查询结果子集不可用,将下一个查询结果子集作为新的第一查询结果子集,并返回到步骤203,直到遍历完所有的所述查询结果子集,跳转到步骤205。
如前所述,每一个查询结果子集都对应有查询条件。如果查询子任务中的第一查询条件包含于第一查询结果子集的查询条件中,则说明查询子任务的查询结果也包含于第一查询结果子集中。比如,某个查询子任务A中的查询条件为“age>30”,而第一查询结果子集对应的查询条件为“age>20”,那么由于查询条件“age>30”包含于查询条件“age>20”中,因此第一查询结果子集的内容已经包括了该查询子任务A需要查询的内容,第一查询结果子集是可用的。相反,如果某个查询子任务A中的查询条件为“age>30”,而第一查询结果子集对应的查询条件为“age>40”,由于查询条件“age>30”未包含于查询条件“age>40”中,第一查询结果子集不能为查询子任务A提供需要查询的内容,因此第一查询结果子集是不可用的。
通过上述步骤202~步骤204的执行,可以确定已有的查询结果集是否可用,再执行后续步骤。
步骤205:如果已有的查询结果可用,则从缓存中获取查询子任务的数据库查询结果;否则,通过数据库获取查询子任务的数据库查询结果。
在已有的查询结果可用的情况下,无需访问数据库,可以快速地从缓存中获取数据库查询结果;在已有的查询结果不可用的情况,才需要访问数据库,获取数据库查询结果。
步骤206:将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果。
本步骤与方法实施例一中的步骤105相同。
仍然以“SELECT name,age FROM user info WHERE age>20AND sex=male”拆分为两个查询子任务为例:①“SELECT name FROM user info WHERE age>30AND sex=male”;②“SELECT age FROM user info WHERE age>30AND sex=male”。假设第一个查询子任务从缓存中获取数据库查询结果(如表一所示),而第二个查询子任务从数据库中获取查询结果(如表二所示),就可以将两者根据主键ID合并后再返回(如表三所示)。
1 | 2 | 3 | 4 | …… |
张三 | 李四 | 王五 | 赵六 | …… |
表一
1 | 2 | 3 | 4 | …… |
31 | 35 | 40 | 38 | …… |
表二
1 | 2 | 3 | 4 | …… |
张三 | 李四 | 王五 | 赵六 | …… |
31 | 35 | 40 | 38 | …… |
表三
实际应用中,为了方便查询,还可以维护一个查询结果子集和查询条件对应关系的表。如表四所示,可以包括字段名称、查询条件以及缓存的起始和结束位置等信息。根据该关系表,就可以很容易确定缓存中查询结果子集所在的位置。
表四
应用本申请方法实施例,由于按照单个字段维度将数据库查询语句进行了拆分,并将已有的查询结果按照单个字段维度保存在缓存中,可以按照最细小的粒度访问缓存,只有缓存中的查询结果不可用的情况下,才访问数据库。因此,本申请方法实施例可以有效地利用已有的查询结果,避免频繁访问数据库,从整体上提高数据库查询的效率。
另外,作为对比的示例:假设在缓存中已经保存有针对“SELECT name,age FROMuser info WHERE age>20AND sex=male”数据库查询语句的查询结果。如果此时接收到另外一个字面不相同但含义相同的数据库查询语句“SELECT age,name,FROM user infoWHERE age>20AND sex=male”,如果采用现有技术,会将两者判断为完全不相同的查询语句,无法从缓存中查询到结果。而如果采用本申请实施例方案,由于需要将数据库语句按照字段维度进行拆分,拆分后的查询子任务相同,因此仍然可以从缓存中获取查询结果,从而提高了效率。
在上述方法实施例二中,步骤204中需要判断查询子任务中的第一查询条件是否包含于第一查询结果子集对应的第二查询条件中,下面提供一种针对步骤204的具体实施方法。在本申请方法实施例中,如果查询子任务中的第一查询条件包含于第一查询结果子集对应的第二查询条件中,则说明第一查询结果子集包括了查询子任务需要查询的结果,可以提供给查询子任务进行查询。当然,这里的前提是查询子任务中的第一目标字段与第一查询结果子集对应的第二目标字段相同。
图4是本申请方法实施例三的流程图,即实现步骤204的具体实施方式。如图4所示,该方法包括:
步骤401:判断第一查询条件的个数与第二查询条件的个数是否相同,如果相同,则继续执行后续步骤402;否则,确定第一查询条件未包含于所述第二查询条件中。
步骤402:判断第一查询条件所包括的字段名与第二查询条件所包括的字段名是否相同,如果相同,则继续执行后续步骤403;否则,确定第一查询条件未包含于所述第二查询条件中。
上述步骤401和步骤402是两种快速确定第一查询条件是否包含于第二查询条件的方法。如果第一查询条件包含于第二查询条件,那么查询条件的个数以及查询条件中包含的字段名相应完全相同。比如,第一查询条件对应的第一目标字段为“age”,第二查询条件对应的第二目标字段也为“age”。其中,第一查询条件包括“age>30”和“sex=male”共两个查询条件,查询条件中包括“age”和“sex”两个字段。第二查询条件包括“age>30”、“occupation=manager”、“sex=female”共三个查询条件,查询条件中包括“age”、“occupation”和“sex”三个字段。也就是说,第二查询条件对应的第一查询结果子集的内容虽然是“name”字段下的姓名,但是第一查询结果子集是通过“age>30”、“occupation=manager”、“sex=female”这三个查询条件得到,而查询子任务是需要按照“age>30”和“sex=male”这两个查询条件进行查询,可以认为第一查询条件未包含于第二查询条件中,第一查询结果子集不能提供给查询子任务进行查询。
步骤403:将第一查询条件中第一目标字段所属的查询条件作为第三查询条件,将第一查询条件中的其他查询条件作为第四查询条件;将第二查询条件中所述第二目标字段的查询条件作为第五查询条件,将第二查询条件中的其他查询条件作为第六查询条件;第三查询条件中的字段名与第五查询条件中的字段名相同。
实际应用中,查询子任务中可能包括多个查询条件,查询结果子集中也可能对应多个查询条件。为了更好地保证查询结果的可用性,可以将查询条件分为两种,一种是目标字段对应的查询条件,另一种是非目标字段对应的查询条件。假设第一查询条件对应的第一目标字段为“age”,第二查询条件对应的第二目标字段也为“age”。其中,第一查询条件包括“age>30”和“sex=male”共两个查询条件。第二查询条件包括“age>20”和“sex=male”共两个查询条件。在这种情况下,由于第一查询条件中“age>30”中的字段“age”正好是第一目标字段,那么将“age>30”作为第三查询条件,将“sex=male”作为第四查询条件。同理,第二查询条件中“age>20”作为第五查询条件,“sex=male”作为第六查询条件。
步骤404:判断第四查询条件与第六查询条件是否相同,如果相同,则继续执行后续步骤405;否则,确定第一查询条件未包含于所述第二查询条件中。
为了保证判断的准确性,在判断一个查询条件是否包含于另一个查询条件中时,需要其他查询条件完全一致。也就是说,在判断第三查询条件是否包含于第五查询条件时,需要保证第四查询条件和第六查询条件完全一致。比如上述示例中,第四查询条件“sex=male”和第六查询条件“sex=male”完全一致,因此可以继续判断第三查询条件是否包含于第五查询条件。相反,如果第四查询条件和第六查询条件不一致,比如第四查询条件“sex=male”和第六查询条件“sex=female”不一致,就不必再继续判断第三查询条件是否包含于第五查询条件。也就是说,缓存中的查询结果子集是根据“age>20”和“sex=female”这两个查询条件得到的,其结果无法提供给查询子任务(包括的查询条件为“age>30”和“sex=male”)进行查询。
步骤405:判断第三查询条件中的运算符与第五查询条件中的运算符是否相同,如果相同,则继续执行后续步骤;否则,确定第一查询条件未包含于所述第二查询条件中。
步骤406:判断第三查询条件中的运算数是否包含于第五查询条件中,如果是,则确定第一查询条件包含于第二查询条件中;否则,确定第一查询条件未包含于第二查询条件中。
为了进一步保证判断的准确性和操作的简便,本申请实施例还进一步通过上述步骤405限定第三查询条件中的运算符与第五查询条件中的运算符相同的情况下,才由步骤406继续判断运算数。比如,第三查询条件“age>30”中的运算符为“>”,运算数为“30”,第五查询条件“age>20”中的运算符也为“>”,且运算数为“30”包含于第五查询条件“age>20”中。因此,可以认为第三查询条件包含于第五查询条件中。由于上述第四查询条件与第六查询条件相同,因此可以认为确定第一查询条件包含于所述第二查询条件中。
在实际应用中,查询条件中运算符可以为“>”、“>=”、“<”、“<=”、“==”、“<>”、“BETWEEN”、“like”等等。下面将以进行详细说明。图5是本申请方法实施例四的流程图,是具体实现步骤406中判断第三查询条件中的运算数是否包含于所述第五查询条件中的方法。
如图5所示,该方法包括:
步骤501:如果第三查询条件中的运算符为“>”或“>=”,那么第三查询条件中的运算数小于第五查询条件中的运算数时,则确定第三查询条件中的运算数未包含于第五查询条件中;否则确定第三查询条件中的运算数包含于第五查询条件中。
针对第三查询条件中的运算符为“>”或“>=”的情况,由于第五查询条件与第三查询条件相同,也应该为“>”或“>=”。因此,如果第三查询条件中的运算数小于第五查询条件中的运算数,则可以认为第三查询条件的取值范围比第五查询条件的大,未包含于第五查询条件中,反之则包含于第五查询条件中。比如,第三查询条件为“age>30”,第五查询条件为“age>20”,可以认为第三查询条件中的运算数包含于第五查询条件中。
步骤502:如果第三查询条件中的运算符为“<”或“<=”,那么第三查询条件中的运算数大于第五查询条件中的运算数时,则确定第三查询条件中的运算数未包含于第五查询条件中;否则确定第三查询条件中的运算数包含于第五查询条件中。
针对第三查询条件中的运算符为“<”或“<=”的情况,由于第五查询条件与第三查询条件相同,也应该为“<”或“<=”。因此,如果第三查询条件中的运算数大于第五查询条件中的运算数,则可以认为第三查询条件的取值范围比第五查询条件的大,未包含于第五查询条件中,反之则包含于第五查询条件中。比如,第三查询条件为“age<60”,第五查询条件为“age<50”,可以认为第三查询条件中的运算数未包含于第五查询条件中。
步骤503:如果第三查询条件中的运算符为“==”或“<>”,那么第三查询条件中的运算数不等于第五查询条件中的运算数时,则确定第三查询条件中的运算数未包含于第五查询条件中;否则确定第三查询条件中的运算数包含于第五查询条件中。
针对第三查询条件中的运算符为“==”或“<>”的情况,由于第五查询条件与第三查询条件相同,也应该为“==”或“<>”。因此,如果第三查询条件中的运算数不等于第五查询条件中的运算数,则可以认为第三查询条件的取值范围与第五查询条件的不相交,未包含于第五查询条件中,反之则包含于第五查询条件中。比如,第三查询条件为“age==60”,第五查询条件为“age==50”,可以认为第三查询条件中的运算数未包含于第五查询条件中。
步骤504:如果第三查询条件中的运算符为“BETWEEN”,那么第三查询条件中的运算数的取值范围大于第五查询条件中的运算数的取值范围时,则确定第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中。
针对第三查询条件中的运算符为“BETWEEN”的情况,其取值范围在运算数表示的范围之内,如果第三查询条件中的运算数的取值范围大于第五查询条件中的运算数的取值范围,则可以认为未包含于第五查询条件中,反之则包含于第五查询条件中。
步骤505:如果第三查询条件中的运算符为“like”,那么第三查询条件中的运算数的取值范围大于第五查询条件中的运算数的取值范围时,则确定第三查询条件中的运算数未包含于第五查询条件中;否则确定第三查询条件中的运算数包含于第五查询条件中。
针对第三查询条件中的运算符为“like”的情况,其取值范围时可以与运算数匹配的范围,如果第三查询条件中与运算数匹配的取值范围大于第五查询条件中的运算数的取值范围,则可以认为未包含于第五查询条件中,反之则包含于第五查询条件中。
上述列举了几种常见的运算符的情况,实际应用中,还可能有其他运算符的情况,此处不再一一赘述。不管是哪种运算符,都可以根据运算数的比较确定第三查询条件的运算数是否包含于第五查询条件中,再利用图4所示的方法实施例三确定第一查询条件是否包含于第二查询条件中,从而确定第一查询结果子集是否可用。
实际应用中,不管当前是从缓存中获得到数据库查询语句的查询结果,还是从数据库中获得数据库查询语句的查询结果,都可以将查询到的结果保存在缓存中,以备下一次查询。为了更好地利用缓存资源,减少缓存碎片,节约缓存资源,本申请实施例还提出一种合并查询结果的方法。也就是说,在方法实施例一的步骤105之后,或者在方法实施例二的步骤206之后,可以继续执行本实施例四的方法。
在本申请方法实施例四中,执行数据库查询语句和查询结果合并的方法可以采用异步方式实现。也就是说,利用上述各方法实施例执行数据库查询语句之后,先将查询结果另行保存,再从中取出查询结果判断是否可以与缓存中已有的查询结果合并。与上述方法实施例相似,合并时也需要先确定查询结果子集,再根据查询条件判断是否可以合并,即:判断数据库查询语句的查询结果是否可以与已有的查询结果集合并,如果可以合并,则将数据库查询语句的查询结果与已有的查询结果集合并;否则,将数据库查询语句的查询结果按照一个字段对应一个查询结果子集的方式保存在缓存中。
图6是本申请实施例四的方法流程图。如图6所示,该方法包括:
步骤601:将数据库查询语句的查询结果按照单个字段维度拆分为待保存查询结果子集,每个待保存查询结果子集对应的字段为第七目标字段,每个待保存查询结果子集对应的查询条件为第七查询条件。
这里所述的数据库查询语句的查询结果是指采用上述任一方法实施例得到的查询结果。比如表三为得到的数据库查询结果,可以通过本步骤601重新拆分为表一和表二。表一和表二所示的内容在这里则称为“待保存查询结果子集”。为了与其他的字段和查询条件区分,拆分后表一对应的字段为“name”(即第七目标字段),查询条件为“age>30”和“sex=male”(即第七查询条件)。表二对应的字段为“age”(即第七目标字段),查询条件为“age>30”和“sex=male”(即第七查询条件)。
步骤602:将已有的查询结果集中的一个查询结果子集作为第二查询结果子集,将第二查询结果子集对应的字段作为第八目标字段,将第二查询结果子集对应的查询条件作为第八查询条件。
步骤603:将第二查询结果子集对应的第八目标字段与待保存查询结果子集对应的第七目标字段进行比较,如果相同,则继续执行后续步骤604;否则确定第二查询结果子集不可合并,将下一个查询结果子集作为新的第二查询结果子集,并返回本步骤603,直到遍历完所有的查询结果子集,并跳转到步骤605。
上述步骤602~步骤603与方法实施例二中的步骤202~步骤203相似,只是这里的目的是确定是否可以合并。
步骤604:判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并,如果可以合并,则确定第二查询结果子集可以合并;否则,确定第二查询结果子集不可合并,将下一个查询结果子集作为新的第二查询结果子集,并返回到步骤603,直到遍历完所有的查询结果子集,并跳转到步骤605。
本步骤与方法实施例二中的步骤201相似,只是在这里的目的是确定是否可以合并。
步骤605:如果第二查询结果子集可以合并,则将待保存查询结果子集与已有的查询结果集合并;否则,将待保存查询结果子集单独保存在缓存中。
在经过上述步骤602~步骤604的一系列判断之后,如果待保存查询结果子集可以与第二查询结果子集合并,则将合并后的结果保存在缓存中,如果不能合并,则重新开辟一块缓存空间,将待保存查询结果子集单独保存。按照这种方式,将所有的待保存查询结果子集单独保存后,也就达到了按照一个字段对应一个查询结果子集的方式保存在缓存中的效果,以供后续的查询使用。
在上述方法实施例四中,步骤604中需要判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并,下面提供一种针对步骤604的具体实施方法。在本申请方法实施例中,如果待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件可以合并,则说明待保存查询结果子集可以与第二查询结果子集合并。当然,这里的前提是待保存查询结果子集对应的第七目标字段与第二查询结果子集对应第八目标字段相同。
图7是本申请方法实施例五的流程图,即实现步骤604的具体实施方式。如图7所示,该方法包括:
步骤701:判断第七查询条件的个数与第八查询条件的个数是否相同,如果相同,则继续执行后续步骤702;否则,确定第七查询条件与第八查询条件不可合并,并结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
步骤702:判断第七查询条件所包括的字段名与第八查询条件所包括的字段名是否相同,如果相同,则继续执行后续步骤703;否则,确定第七查询条件与第八查询条件不可合并,并结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
上述步骤701~步骤702与方法实施例三中的步骤401~步骤402相似,只是这里的目的是确定是否可以合并。也就是说,如果待保存查询结果子集需要与第二查询结果子集合并,要求第七查询条件的个数与第八查询条件的个数相同,且第七查询条件所包括的字段名与第八查询条件所包括的字段名相同。
步骤703:将第七查询条件中第七目标字段所属的查询条件作为第九查询条件,将第七查询条件中的其他查询条件作为第十查询条件;将第八查询条件中所属第八目标字段的查询条件作为第十一查询条件,将第八查询条件中的其他查询条件作为第十二查询条件;第九查询条件中的字段名与第十一查询条件中的字段名相同。
本步骤与方法实施例三中的步骤403相似,将查询条件分为两种,一种是目标字段对应的查询条件,另一种是非目标字段对应的查询条件。
步骤704:判断第十查询条件与第十二查询条件是否相同,如果相同,则继续执行后续步骤705;否则,确定第七查询条件与第八查询条件不可合并,并结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
本步骤与方法实施例四中的步骤404相似。
步骤705:判断第九查询条件与第十一查询条件是否存在交集,如果有交集,则继续执行;否则确定第七查询条件与第八查询条件不可合并,并结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
实际应用中,如果第九查询条件与第十一查询条件没有交集,很显然是不可合并的。比如:第九查询条件的取值范围为“50<age<70”,而第十一查询条件的取值范围为“20<age<40”,两者没有交集,那么第九查询条件和第十一查询条件是不可合并的。
如果第九查询条件与第十一查询条件存在交集,那么可以分为以下情况:第一种情况,第九查询条件包含于第十一查询条件中;第二种情况,第十一查询条件包含于第九查询条件中,第三种情况,第九查询条件与第十一查询条件部分相交。下面利用步骤706~步骤708分别进行说明。
步骤706:如果第九查询条件包含于第十一查询条件中,则直接结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
如果第九查询条件包含于第十一查询条件,按照本申请上述方法实施例的实现,那么第七查询条件对应的待保存查询结果子集应该是从第二查询结果子集中获得的,其已经保存在缓存中,无需再次保存。
步骤707:如果第十一查询条件包含于第九查询条件中,则确定第七查询条件与第八查询条件可合并,并结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
如果第十一查询条件包含于第九查询条件中,在后续步骤605进行合并时,可以将缓存中的第二查询结果子集替换为待保存查询结果子集,将第十一查询条件替换为第九查询条件。按照本申请上述方法实施例的实现,第九查询条件对应的待保存查询结果子集应该是从数据库中获得,且已经包含了第十一查询条件对应的第二查询结果子集。为了更好地利用缓存,将第二结果子集替换为待保存查询结果子集,无需单独为待保存查询结果子集开辟缓存。
步骤708:如果第九查询条件与第十一查询条件部分相交,则确定第七查询条件与第八查询条件可合并,并结束判断待保存查询结果子集中的第七查询条件与第二查询结果子集对应的第八查询条件是否可以合并的步骤。
如果第九查询条件与第十一查询条件部分相交,在后续步骤605进行合并时,将待保存查询结果子集与第二查询结果子集合并后保存在缓存中,且将第九查询条件与第十一查询条件合并后保存在缓存中。
比如:第九查询条件为“20<age<50”,第十一查询条件为“30<age<60”,第九查询条件与第十一查询条件部分相交。按照本申请上述方法实施例的实现,第九查询条件对应的待保存查询结果子集应该是从数据库中获得,且包含部分第十一查询条件对应的第二查询结果子集。假设第九查询条件对应的待保存查询结果子集如表四所示,第十一查询条件对应的第二查询结果子集如表五所示,合并之后的结果如表六所示,对应的查询条件则合并为“20<age<60”。
1 | 2 | 3 | 4 | … |
25 | 32 | 38 | 49 | … |
表四
1 | 2 | 3 | 4 | … |
38 | 49 | 54 | 58 | … |
表五
1 | 2 | 3 | 4 | 5 | 6 | … |
25 | 32 | 38 | 49 | 54 | 58 | … |
表六
上述实施例提供了如何将数据库查询语句的查询结果与已有的查询结果集合进行合并的方法,可以节约缓存。实际应用中,还可以在缓存空间达到使用上限后,再进行内存回收,避免内存空间的无限扩张。
本申请还提供一种数据库查询的装置实施例。图8是本申请实现数据库查询的装置实施例一的结构示意图。如图8所示,该装置包括:查询语句解析模块801、第一查询模块802和第一合并模块803。其中:
查询语句解析模块801,利用抽象语法树解析数据库查询语句,并按照单个字段维度将数据库查询语句拆分为查询子任务,每一个查询子任务包括第一目标字段和第一查询条件,第一目标字段表示需要查询的单个字段,第一查询条件表示查询第一目标字段时的筛选条件,筛选条件包括字段名、运算符和运算数。
第一查询模块802,针对每一个所述查询子任务,根据第一目标字段和第一查询条件判断已有的查询结果集是否可用,已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存中;如果已有的查询结果可用,则从缓存中获取查询子任务的数据库查询结果;否则,通过数据库获取查询子任务的数据库查询结果。
第一合并模块803,将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果。
也就是说,查询语句解析模块801利用抽象语法树解析数据库查询语句,并按照单个字段维度将数据库查询语句拆分为查询子任务;第一查询模块802针对每一个所述查询子任务,根据第一目标字段和第一查询条件判断已有的查询结果集是否可用,如果已有的查询结果集可用,则从缓存中获取查询子任务的数据库查询结果;否则,通过数据库获取查询子任务的数据库查询结果;第一合并模块803将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果。
应用本申请实施例方案,由于将数据库查询语句按单个字段进行了拆分,已有的数据库查询结果集也按照单个字段拆分后保存在缓存中,因此可以很方便地判断缓存中的已有的查询结果集是否可用,避免字面含义不同但实际相同的查询语句无法利用已有的查询结果的缺陷,大大提高了数据库查询的效率。
实际应用中,第一查询模块802还可以采用上述方法实施例二和方法实施例三实现判断已有的查询结果是否可用的方案。查询语句解析模块801、第一查询模块802和第一合并模块803可以由一个或几个功能模块实现。已有的查询结果集和数据库查询语句的查询结果可以保存在一个或几个缓存中。当然,本申请装置实施例中还包括缓存(这里未示出)。
另外,本申请装置实施例一还可以进一步增加缓存整理模块804,用于判断数据库查询语句的查询结果是否可以与所述已有的查询结果集合并,如果可以合并,则将数据库查询语句的查询结果与已有的查询结果集合并;否则,将数据库查询语句的查询结果按照一个字段对应一个查询结果子集的方式保存在缓存中。缓存整理模块804还可以按照上述方法实施例四和方法实施例五的方案具体实现如何判断数据库查询语句的查询结果是否可以与所述已有的查询结果集合并。
图9是本申请实施例提供的一种实现上述各个实施例的系统结构示意图。如图9所示,该系统可以包括查询语句解析模块901、存储代理模块902、多个缓存903、缓存整理模块904、数据库905。
其中,查询语句解析模块901相当于查询语句解析模块801,利用抽象语法树解析数据库查询语句,并按照单个字段维度将数据库查询语句拆分为查询子任务,每一个查询子任务包括第一目标字段和第一查询条件,第一目标字段表示需要查询的单个字段,第一查询条件表示查询第一目标字段时的筛选条件,筛选条件包括字段名、运算符和运算数。
存储代理模块902相当于第一查询模块802和第一合并模块803,针对每一个所述查询子任务,根据第一目标字段和第一查询条件判断已有的查询结果集是否可用,已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存903中;如果已有的查询结果可用,则从缓存中获取查询子任务的数据库查询结果;否则,通过数据库获取查询子任务的数据库查询结果;将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果,将所有的查询子任务的数据库查询结果进行合并,作为数据库查询语句的查询结果。
缓存903,用于保存已有的查询结果集。
缓存整理模块904相当于缓存整理模块804,用于判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并,如果可以合并,则将所述数据库查询语句的查询结果与所述已有的查询结果集合并;否则,将所述数据库查询语句的查询结果按照一个字段对应一个查询结果子集的方式保存在缓存903中。
数据库905用于提供需要查询的数据,可以是关系型数据库,比如OLAP型数据库。
本申请实施例还提供一种计算机可读介质,所述计算机可读存储介质存储指令,所述指令在由处理器执行时可执行如上所述的数据库查询的方法中的步骤。实际应用中,所述的计算机可读介质可以是上述实施例中描述的设备/装置/系统中所包含的,也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或多个程序被执行时,可以实现上述各实施例描述的数据库查询的方法。根据本申请公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件,或者上述的任意合适的组合,但不用于限制本申请保护的范围。在本申请公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
如图10所示,本申请实施例还提供一种电子设备,其中可以集成本申请实施例实现方法的装置。如图10所示,其示出了本发明实施例所涉及的电子设备的结构示意图,具体来讲:
该电子设备可以包括一个或一个以上处理核心的处理器1001、一个或一个以上计算机可读存储介质的存储器1002以及存储在存储器上并可在处理器上运行的计算机程序。在执行所述存储器1002的程序时,可以实现上述数据库查询的方法。
具体的,实际应用中,该电子设备还可以包括电源1003、输入单元1004、以及输出单元1005等部件。本领域技术人员可以理解,图10中示出的电子设备的结构并不构成对该电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
处理器1001是该电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器1002内的软件程序和/或模块,以及调用存储在存储器1002内的数据,执行服务器的各种功能和处理数据,从而对该电子设备进行整体监控。
存储器1002可用于存储软件程序以及模块,即上述计算机可读存储介质。处理器1001通过运行存储在存储器1002的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器1002可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据服务器的使用所创建的数据等。此外,存储器1002可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器1002还可以包括存储器控制器,以提供处理器1001对存储器1002的访问。
该电子设备还包括给各个部件供电的电源1003,可以通过电源管理系统与处理器1001逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源1003还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
该电子设备还可包括输入单元1004,该输入单元1004可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
该电子设备还可以包括输出单元1005,该输出单元1005可以用于显示由用户输入的信息或提供给用户的信息以及各种图像用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。
本申请实施例还提供一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令在被处理器执行时实施如上述任一实施例所述的方法。
本申请附图中的流程图和框图,示出了按照本申请公开的各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或者代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应该注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同附图中所标准的顺序发生。例如,两个连接地表示的方框实际上可以基本并行地执行,它们有时也可以按照相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或者流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本申请中。特别地,在不脱离本申请精神和教导的情况下,本申请的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,所有这些组合和/或结合均落入本申请公开的范围。
本文中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思路,并不用于限制本申请。对于本领域的技术人员来说,可以依据本发明的思路、精神和原则,在具体实施方式及应用范围上进行改变,其所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
Claims (10)
1.一种数据库查询的方法,其特征在于,该方法包括:
利用抽象语法树解析数据库查询语句,并按照单个字段维度将所述数据库查询语句拆分为查询子任务,每一个所述查询子任务包括第一目标字段和第一查询条件,所述第一目标字段表示需要查询的单个字段,所述第一查询条件表示查询所述第一目标字段时的筛选条件,所述筛选条件包括字段名、运算符和运算数;
针对每一个所述查询子任务,根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用,所述已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存中;如果所述已有的查询结果集可用,则从所述缓存中获取所述查询子任务的数据库查询结果;否则,通过数据库获取所述查询子任务的数据库查询结果;
将所有的所述查询子任务的数据库查询结果进行合并,作为所述数据库查询语句的查询结果。
2.根据权利要求1所述的方法,其特征在于,所述根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用的步骤包括:
将所述已有的查询结果集中的一个查询结果子集作为第一查询结果子集,将所述第一查询结果子集对应的字段作为第二目标字段,将所述第一查询结果子集对应的查询条件作为第二查询条件;
将所述查询子任务中的所述第一目标字段和所述第一查询结果子集对应的所述第二目标字段进行比较,如果相同,则继续执行后续步骤;否则确定所述第一查询结果子集不可用,将下一个查询结果子集作为新的第一查询结果子集,并返回到所述将所述查询子任务中的所述第一目标字段和所述第一查询结果子集对应的所述第二目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集,结束所述根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用的步骤;
判断所述查询子任务中的所述第一查询条件是否包含于所述第一查询结果子集对应的第二查询条件中,如果是,则确定所述第一查询结果子集可用;否则,确定所述第一查询结果子集不可用,将下一个查询结果子集作为新的第一查询结果子集,并返回到所述将所述查询子任务中的所述第一目标字段和所述第一查询结果子集对应的所述第二目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集。
3.根据权利要求2所述的方法,其特征在于,所述判断查询子任务中的所述第一查询条件是否包含于所述第一查询结果子集对应的第二查询条件中的步骤包括:
判断所述第一查询条件的个数与所述第二查询条件的个数是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
判断所述第一查询条件所包括的字段名与所述第二查询条件所包括的字段名是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
将所述第一查询条件中所述第一目标字段所属的查询条件作为第三查询条件,将所述第一查询条件中的其他查询条件作为第四查询条件;将所述第二查询条件中所述第二目标字段所属的查询条件作为第五查询条件,将所述第二查询条件中的其他查询条件作为第六查询条件;所述第三查询条件中的字段名与所述第五查询条件中的字段名相同;
判断所述第四查询条件与所述第六查询条件是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
判断所述第三查询条件中的运算符与所述第五查询条件中的运算符是否相同,如果相同,则继续执行后续步骤;否则,确定所述第一查询条件未包含于所述第二查询条件中;
判断所述第三查询条件中的运算数是否包含于所述第五查询条件中,如果是,则所述第一查询条件包含于所述第二查询条件中;否则,确定所述第一查询条件未包含于所述第二查询条件中。
4.根据权利要求3所述的方法,其特征在于,所述判断所述第三查询条件中的运算数是否包含于所述第五查询条件中的步骤包括:
如果所述第三查询条件中的运算符为“>”或“>=”,那么所述第三查询条件中的运算数小于所述第五查询条件中的运算数时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“<”或“<=”,那么所述第三查询条件中的运算数大于所述第五查询条件中的运算数时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“==”或“<>”,那么所述第三查询条件中的运算数不等于所述第五查询条件中的运算数时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“BETWEEN”,那么所述第三查询条件中的运算数的取值范围大于所述第五查询条件中的运算数的取值范围时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中;
如果所述第三查询条件中的运算符为“like”,那么所述第三查询条件中的运算数的取值范围大于所述第五查询条件中的运算数的取值范围时,则确定所述第三查询条件中的运算数未包含于所述第五查询条件中;否则确定所述第三查询条件中的运算数包含于所述第五查询条件中。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述将所有的所述查询子任务的数据库查询结果进行合并,作为所述数据库查询语句的查询结果的步骤之后,该方法进一步包括:
判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并,如果可以合并,则将所述数据库查询语句的查询结果与所述已有的查询结果集合并;否则,将所述数据库查询语句的查询结果按照一个字段对应一个查询结果子集的方式保存在缓存中。
6.根据权利要求5所述的方法,其特征在于,所述判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并的步骤包括:
将所述数据库查询语句的查询结果按照单个字段维度拆分为待保存查询结果子集,每个所述待保存查询结果子集对应的字段为第七目标字段,每个所述待保存查询结果子集对应的查询条件为第七查询条件;
将所述已有的查询结果集中的一个查询结果子集作为第二查询结果子集,将所述第二查询结果子集对应的字段作为第八目标字段,将所述第二查询结果子集对应的查询条件作为第八查询条件;
将所述第二查询结果子集对应的所述第八目标字段与所述待保存查询结果子集对应的第七目标字段进行比较,如果相同,则继续执行后续步骤;否则确定所述第二查询结果子集不可合并,将下一个查询结果子集作为新的第二查询结果子集,并返回到所述将所述第二查询结果子集对应的所述第八目标字段与所述待保存查询结果子集对应的第七目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集,结束所述判断所述数据库查询语句的查询结果是否可以与所述已有的查询结果集合并的步骤;
判断所述待保存查询结果子集中的所述第七查询条件与所述第二查询结果子集对应的第八查询条件是否可以合并,如果可以合并,则确定所述第二查询结果子集可以合并;否则,确定所述第二查询结果子集不可合并,将下一个查询结果子集作为新的第二查询结果子集,并返回到所述将所述第二查询结果子集对应的所述第八目标字段与所述待保存查询结果子集对应的第七目标字段进行比较的步骤,直到遍历完所有的所述查询结果子集。
7.一种数据库查询的装置,其特征在于,该装置包括:
查询语句解析模块,利用抽象语法树解析数据库查询语句,并按照单个字段维度将所述数据库查询语句拆分为查询子任务,每一个所述查询子任务包括第一目标字段和第一查询条件,所述第一目标字段表示需要查询的单个字段,所述第一查询条件表示查询所述第一目标字段时的筛选条件,所述筛选条件包括字段名、运算符和运算数;
第一查询模块,针对每一个所述查询子任务,根据所述第一目标字段和所述第一查询条件判断已有的查询结果集是否可用,所述已有的查询结果集是先前的数据库查询结果的集合,且按照一个字段对应一个查询结果子集的方式保存在缓存中;如果所述已有的查询结果集可用,则从所述缓存中获取所述查询子任务的数据库查询结果;否则,通过数据库获取所述查询子任务的数据库查询结果;
第一合并模块,将所有的所述查询子任务的数据库查询结果进行合并,作为所述数据库查询语句的查询结果。
8.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,所述指令被处理器执行时可实现权利要求1~6任一项所述数据库查询的方法的步骤。
9.一种数据可视化展示的电子设备,其特征在于,该电子设备包括:
处理器;
用于存储所述处理器可执行指令的存储器;
所述处理器,用于从所述存储器中读取所述可执行指令,并执行所述指令以实现上述权利要求1~6任一项所述的数据库查询的方法。
10.一种计算机程序产品,包括计算机指令,所述计算机指令在被处理器执行时实施如上述权利要求1~6任一项所述的数据库查询的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111269575.XA CN114003619A (zh) | 2021-10-29 | 2021-10-29 | 一种数据库查询的方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111269575.XA CN114003619A (zh) | 2021-10-29 | 2021-10-29 | 一种数据库查询的方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114003619A true CN114003619A (zh) | 2022-02-01 |
Family
ID=79925017
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111269575.XA Pending CN114003619A (zh) | 2021-10-29 | 2021-10-29 | 一种数据库查询的方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114003619A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817293A (zh) * | 2022-03-31 | 2022-07-29 | 华能信息技术有限公司 | 一种基于分布式sql的数据查询方法及系统 |
-
2021
- 2021-10-29 CN CN202111269575.XA patent/CN114003619A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817293A (zh) * | 2022-03-31 | 2022-07-29 | 华能信息技术有限公司 | 一种基于分布式sql的数据查询方法及系统 |
CN114817293B (zh) * | 2022-03-31 | 2022-11-08 | 华能信息技术有限公司 | 一种基于分布式sql的数据查询方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10866971B2 (en) | Hash collision tables for relational operations | |
RU2663358C2 (ru) | Устройство и способ кластерного хранения | |
CN106919675B (zh) | 一种数据存储方法及装置 | |
CN110807041B (zh) | 索引推荐方法、装置、电子设备及存储介质 | |
US10565201B2 (en) | Query processing management in a database management system | |
WO2017019879A1 (en) | Multi-query optimization | |
US11188552B2 (en) | Executing conditions with negation operators in analytical databases | |
CN109947804B (zh) | 数据集合查询的优化方法、装置、服务器和存储介质 | |
US10685031B2 (en) | Dynamic hash partitioning for large-scale database management systems | |
CN109299101B (zh) | 数据检索方法、装置、服务器和存储介质 | |
US20150019583A1 (en) | Intelligently utilizing non-matching weighted indexes | |
CN111104426B (zh) | 一种数据查询方法及系统 | |
US20080091642A1 (en) | Advising the generation of a maintained index over a subset of values in a column of a table | |
US20200257684A1 (en) | Higher-order data sketching for ad-hoc query estimation | |
CN114547095A (zh) | 一种数据快速查询方法、装置、电子设备和存储介质 | |
CN111767320A (zh) | 数据血缘关系确定方法及装置 | |
WO2022253131A1 (zh) | 数据解析方法、装置、计算机设备和存储介质 | |
CN115237920A (zh) | 面向负载的数据索引推荐方法及其装置、存储介质 | |
CN114003619A (zh) | 一种数据库查询的方法、装置、电子设备及存储介质 | |
CN109656947B (zh) | 数据查询方法、装置、计算机设备和存储介质 | |
CN113609128A (zh) | 生成数据库实体类的方法、装置、终端设备及存储介质 | |
CN109697234B (zh) | 实体的多属性信息查询方法、装置、服务器和介质 | |
CN114547086B (zh) | 数据处理方法、装置、设备及计算机可读存储介质 | |
CN111125216A (zh) | 数据导入Phoenix的方法及装置 | |
CN110990421A (zh) | 一种数据查询的方法、装置及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |