本公开涉及计算机
技术领域:
:,更具体地,涉及一种数据查询方法和装置、一种电子设备、以及一种计算机可读存储介质。
背景技术:
::在进行数据查询时关联式查询操作join通常要关联多个数据表,因此相比都于单表查询join操作的数据量通常比较大,操作相对复杂,对数据查询的速率和效率影响也比较大。尤其是列式存储数据库clickhouse在多表关联查询上表现明显不足。在现有clickhouse提供的技术中,单表的各类分析式查询已经比较完善,但是在面对风控分析需要的多表关联式查询上表现明显不足。这时由于多表关联的聚合性能明显比单表聚合降低,即使在相同数据体量下,一些情况下clickhouse查询速率会慢于presto等平台。join的问题,会让clickhouse以大数据量分析见长的能力无法发挥,甚至在一些场景下,分析师不得不继续回到presto去完成分析。技术实现要素:有鉴于此,本公开实施例提供了一种可以减少join操作的数据量的数据查询方法、装置、电子设备、以及计算机可读存储介质。本公开实施例的一个方面提供了一种数据查询方法。所述方法包括:获取第一查询语句,所述第一查询语句包括对m个数据表中的数据的关联式查询操作,其中,m为大于等于2的整数;根据所述m个数据表中每个数据表的查询过滤条件,获取所述每个数据表的查询行数;基于所述每个数据表的查询行数,从所述m个数据表中确定出查询行数最小的一个数据表,其中,以所述查询行数最小的数据表作为第一数据表;获取所述第一数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到候选关联数据列,其中,一个记录为数据表中的一行;以及基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果。根据本公开的实施例,所述获取第一查询语句包括:接收用户输入的所述第一查询语句;解析所述第一查询语句,得到所述第一查询语句对应的第一抽象语法树;以及从所述第一抽象语法树中得到所述m个数据表、所述m个数据表中每个数据表的查询过滤条件、以及所述关联式查询操作。根据本公开的实施例,所述基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果包括:以所述m个数据表中除所述第一数据表之外的每个数据表作为一个第二数据表,在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件;基于每个所述第二数据表的所述新的查询过滤条件,修改所述第一查询语句,得到第二查询语句;以及按照所述第二查询语句进行数据查询,得到所述最终查询结果。根据本公开的实施例,所述在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件包括:获取所述第二数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到待比较关联数据列;基于所述待比较关联数据列与所述候选关联数据列的对比,设置所述新的查询过滤条件;以及将所述新的查询过滤条件追加到所述第二数据表的查询过滤条件中。根据本公开的实施例,所述在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件包括:在所述第一抽象语法树中,在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件,得到第二抽象语法树。则,所述基于每个所述第二数据表的追加的查询过滤条件,修改所述第一查询语句,得到第二查询语句,包括基于所述第二抽象语法树,反向生成所述第二查询语句。根据本公开的实施例,所述基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果包括:分别按照所述m个数据表各自的查询过滤条件,从各自的数据表中的与所述候选关联数据列对应的记录中进行数据查询,得到与所述m个数据表一一对应的m个中间查询结果;以及将所述m个中间查询结果基于所述关联查询操作进行关联,得到所述最终查询结果。根据本公开的实施例,所述分别按照所述m个数据表各自的查询过滤条件,从各自的数据表中的与所述候选关联数据列对应的记录中进行数据查询,得到与所述m个数据表一一对应的m个中间查询结果包括:按照所述第一数据表的查询过滤条件从所述第一数据表中查询出第一中间查询结果;以及以所述m个数据表中除所述第一数据表之外的每个数据表作为一个第二数据表,按照每个第二数据表的查询过滤条件从所述第二数据表中的所述候选关联数据列所在的记录中查询出一个第二中间查询结果,其中,从m-1个所述第二数据表中对应查询出m-1个所述第二中间查询结果。其中,所述m个中间查询结果包括所述第一中间查询结果和m-1个所述第二中间查询结果。根据本公开的实施例,所述方法应用于列式存储数据库。本公开实施例的另一方面,提供了一种数据查询装置。所述装置包括查询语句获取模块、查询行数获取模块、最小表确定模块、关联列获取模块、以及数据查询模块。所述查询语句获取模块用于获取第一查询语句,所述第一查询语句包括对m个数据表中的数据的关联式查询操作,其中,m为大于等于2的整数。所述查询行数获取模块用于根据所述m个数据表中每个数据表的查询过滤条件,获取所述每个数据表的查询行数。所述最小表确定模块用于基于所述每个数据表的查询行数,从所述m个数据表中确定出查询行数最小的一个数据表,其中,以所述查询行数最小的数据表作为第一数据表。所述关联列获取模块用于获取所述第一数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到候选关联数据列,其中,一个记录为数据表中的一行。所述数据查询模块用于基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果。根据本公开的实施例,所述数据查询模块包括过滤条件追加子模块、查询语句修改子模块、以及查询子模块。过滤条件追加子模块用于以所述m个数据表中除所述第一数据表之外的每个数据表作为一个第二数据表,在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件。查询语句修改子模块,用于基于每个所述第二数据表的所述新的查询过滤条件,修改所述第一查询语句,得到第二查询语句。所述查询子模块用于按照所述第二查询语句进行数据查询,得到所述最终查询结果。根据本公开的实施例,所述数据查询模块包括中间结果获得子模块、以及关联子模块。所述中间结果获得子模块用于分别按照所述m个数据表各自的查询过滤条件,从各自的数据表中的与所述候选关联数据列对应的记录中进行数据查询,得到与所述m个数据表一一对应的m个中间查询结果。所述关联子模块与用于将所述m个中间查询结果基于所述关联查询操作进行关联,得到所述最终查询结果。本公开实施例的另一方面,提供了一种电子设备。所述电子设备包括一个或多个存储器、以及一个或多个处理器。其中,所述存储器上存储有计算机可执行指令。所述处理器执行所述指令,以实现如上所述的方法。本公开实施例的另一方面提供了一种计算机可读存储介质,存储有计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。本公开实施例的另一方面提供了一种计算机程序,所述计算机程序包括计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。上述一个或多个实施例具有如下优点或益效果:可以至少部分地减少多表关联查询join操作的数据量,并因此可以一定程度上提高数据查询的效率。附图说明通过以下参照附图对本公开实施例的描述,本公开的上述以及其他目的、特征和优点将更为清楚,在附图中:图1示意性示出了根据本公开实施例的数据查询方法和装置的应用场景;图2示意性示出了根据本公开实施例的数据查询方法的流程图;图3示意性示出了根据本公开一实施例的从每个数据表各自的与候选关联数据列对应的记录中进行数据查询的流程图;图4示意性示出了根据本公开另一实施例的从每个数据表各自的与候选关联数据列对应的记录中进行数据查询的流程图;图5a示意性示出了根据本公开一实施例的第一抽象语法树的示意图;图5b示意性示出了将图5a所示的第一抽象语法树修改为第二抽象语法树的示意图;图6示意性示出了将根据本公开实施例的数据查询方法应用于列式存储数据库clickhouse的一个应用实例的流程图;图7示意性示出了根据本公开实施例的数据查询装置的框图;以及图8示意性示出了适于实现根据本公开实施例的数据查询方法的电子设备的方框图。具体实施方式以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。在下面的详细描述中,为便于解释,阐述了许多具体的细节以提供对本公开实施例的全面理解。然而,明显地,一个或多个实施例在没有这些具体细节的情况下也可以被实施。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。在此使用的术语“包括”、“包含”等表明了所述特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。在使用类似于“a、b和c等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有a、b和c中至少一个的系统”应包括但不限于单独具有a、单独具有b、单独具有c、具有a和b、具有a和c、具有b和c、和/或具有a、b、c的系统等)。在使用类似于“a、b或c等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有a、b或c中至少一个的系统”应包括但不限于单独具有a、单独具有b、单独具有c、具有a和b、具有a和c、具有b和c、和/或具有a、b、c的系统等)。本公开的实施例提供了一种数据查询方法和装置、一种电子设备、以及一种计算机可读存储介质。该方法包括首先获取第一查询语句,第一查询语句包括对m个数据表中的数据的关联式查询操作。然后根据m个数据表中每个数据表的查询过滤条件,获取每个数据表的查询行数。接着基于每个数据表的查询行数,从m个数据表中确定出查询行数最小的一个数据表,其中,以查询行数最小的数据表作为第一数据表。再然后,获取第一数据表基于其自己的查询过滤条件确定出的记录中关联式查询操作所依据的字段的数据列,得到候选关联数据列。最后基于分别从m个数据表各自的与候选关联数据列对应的记录中进行数据查询,得到最终查询结果。根据本公开的一个实施例,在具体查询时可以是对除了第一数据表之外的其他数据表(即,第二数据表)追加新的查询过滤条件,通过该新的查询过滤条件将每个第二数据表的查询数据范围限定在与候选关联数据列对应的记录中。并基于追加的新的查询语句修改第一查询语句,得到第二查询语句,这样可以基于该第二查询语句进行数据查询。当将第二查询语句提交给列式存储数据库(例如,clickhouse)时,可以使clickhouse在执行多表关联join操作的数据量减少,提高数据查询效率。根据本公开的另一个实施例,在具体查询时可以分别从每个数据表中按照各自的查询过滤条件从与候选关联数据列对应的记录中查询数据,得到中间查询结果,然后把中间查询结果按照关联式查询操作进行关联,得到最终查询结果。以此方式,可以减少除了第一数据表之外从其他数据表中查询的数据量,从而使得join操作所执行的数据量减少,提高查询效率。图1示意性示出了根据本公开实施例的数据查询方法和装置的应用场景100。需要注意的是,图1所示仅为可以应用本公开实施例的应用场景的示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例不可以用于其他设备、系统、环境或场景。如图1所示,根据该实施例的应用场景100可以包括至少一个终端没备(图中示意出三个,终端设备101、102、103),网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。用户可以使用终端设备101、102、103通过网络104与服务器105交互,进行数据查询。服务器105可以是数据库服务器,例如clickhouse列式存储数据库服务器。需要说明的是,本公开实施例所提供的数据查询方法一般可以由服务器105执行。相应地,本公开实施例所提供的数据查询装置一般可以设置于服务器105中。本公开实施例所提供的数据查询方法也可以由不同于服务器105且能够与终端设备101、102、103和/或服务器105通信的服务器或服务器集群执行。相应地,本公开实施例所提供的数据查询装置也可以设置于不同于服务器105且能够与终端设备101、102、103和/或服务器105通信的服务器或服务器集群中。应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。图2示意性示出了根据本公开实施例的数据查询方法的流程图。如图2所示,根据该实施例的数据查询方法可以包括操作s210~操作s250。在操作s210,获取第一查询语句,该第一查询语句包括对m个数据表中的数据的关联式查询操作,其中,m为大于等于2的整数。该第一查询语句例如可以是sql语句(structuredquerylanguage,结构化查询语句)。该关联是查询操作例如可以是sql语句中join操作。其中,sql语句对于每个数据表进行查询时还包括由每个数据表各自的查询过滤条件,通过以where后的条件表达式来表示。在一个实施例中,操作s210中具体可以包括将用户输入的sql语句解析成抽象语法树,然后从抽象语法树中获取sql语句各部分的内容。例如,首先接收用户输入的第一查询语句,然后解析第一查询语句,得到第一查询语句对应的第一抽象语法树,接着从第一抽象语法树中得到m个数据表、m个数据表中每个数据表的查询过滤条件、以及关联式查询操作。抽象语法树可以包括项目(即,project)、过滤器(即,filter)以及关联操作(即,join)等多个段。其project就是要查询的字段以及其归属的数据表。filter就是where后的条件表达式。join就是关联的条件以及数据表等。以用户输入的以下sql语句001作为上述第一查询语句进行示例性说明如下。该sql语句001如下:selecttable1.name,table2.scorefromtable1jointable2on(table1.id=table2.id)wheretable1.age>50andtable2.score>90.1.其中,table1和table2如下表1和表2所示:表1:table1idagename170张三251张四360张五440张六表2:table2idscore139291360493通过解析该sql语句001,可以得到如图5a所示的第一抽象语法树500a。从第一抽象语法树500a中可以得到该sql语句001需要从table1中查询name、age两个字段,从table2中查询score字段的数据。table1的查询过滤条件filter为age>50,table2的查询过滤条件filter为score>90。该第一查询语句001的关联式查询操作join要关联将从table1和table2中分别查询出的数据基于键值id字段关联在一起。在操作s220,根据m个数据表中每个数据表的查询过滤条件,获取每个数据表的查询行数。例如,根据table1的查询过滤条件age>50,可以确定出table1的查询行数为3。例如,根据table2的查询过滤条件score>90,可以确定出table2的查询行数为2。在一个实施例中,可以从第一查询语句对应的抽象语法树得到执行计划,然后根据执行计划中的join条件以及各个数据表的filter条件,判断出对每个数据表的查询行数。在操作s230,基于每个数据表的查询行数,从m个数据表中确定出查询行数最小的一个数据表,其中,可以以查询行数最小的数据表作为第一数据表进行区分。从而,在上述的table1和table2中,table2的查询行数最小。这样可以将table2作为第一数据表,来表征table1和table2中查询函数最小的一个表(即,小表),相对而言table1就可以被视为大表。可以理解,在另一些实施例中,m可以是大于2的任意整数。多个数据表中可以存在唯一的查询行数最小的数据表,也可能存在多个查询行数最小的表。此时可以从该多个查询函数最小的表中选择出一个作为该第一数据表。在操作s240,获取第一数据表基于其自己的查询过滤条件确定出的记录中关联式查询操作所依据的字段的数据列,得到候选关联数据列,其中,一个记录为数据表中的一行。例如,从table2中按照其自己的查询过滤条件score>90确定出的记录是score=91、和score=93这两个数据所在的记录。其中,该两个记录中用作关联式查询操作的字段id对应取值为2和4,从而得到该候选关联数据列为id={2,4}。在列式存储数据库中,由于数据的存储是按照字段一列一列存储的,从而在取出该选关联数据列时会明显快于传统的行式存储数据库。在操作s250,基于分别从m个数据表各自的与候选关联数据列对应的记录中进行数据查询,得到最终查询结果。这样,在对table1进行查询时可以仅从id={2,4}的记录中取出要查询的数据,对table2也可以直接取出id={2,4}的记录中取出要查询的数据。然后,再通过join操作得到最终查询结果。这样,可以明显减少大表中取出的数据量,减少了join操作出现的数据量,提高了查询效率。尤其是对于clickhouse,可以极大地降低触发max_rows_in_join或max_bytes_in_join的概率,提高clickhouse表关联式查询的效率。图3示意性示出了根据本公开一实施例的操作s250中从每个数据表各自的与候选关联数据列对应的记录中进行数据查询的流程图。如图3所示,根据该实施例操作s250可以包括操作s301和操作s302。在操作s301,分别按照m个数据表各自的查询过滤条件,从各自的数据表中的与候选关联数据列对应的记录中进行数据查询,得到与m个数据表一一对应的m个中间查询结果。在一个实施例中,该m个中间查询结果可以包括从第一数据表中查询得到的第一中间查询结果、以及从m-1个其他数据表分别查询后得到的m-1个第二中间查询结果。为了区分和描述清楚起见,可以以m个数据表中除第一数据表之外的每个数据表作为一个第二数据表。对于第一数据表,可以按照第一数据表的查询过滤条件从第一数据表中查询出第一中间查询结果。对于每个第二数据表,可以按照该第二数据表的查询过滤条件从第二数据表中的候选关联数据列所在的记录中查询出一个第二中间查询结果。从而,从m-1个第二数据表中对应查询出m-1个第二中间查询结果。在操作s302,将m个中间查询结果基于关联查询操作进行关联,得到最终查询结果。例如,以sql语句001为例,可以将候选关联数据列id={2,4}广播到table1,然后table1可以在id={2,4}对应的记录中查询age>50的数据,从而table1中只需要取出一行数据需要查询的字段(即,第二日中间查询语句),如下表3。表3:idagename251张四而table2作为第一数据表,可以直接按照自己的查询过滤条件score>90查询出两行数据(即,第一中间查询语句),如表4:表4:idscore291493然后再将表3和表4通过基于id字段按照“fromtable1jointable2on(table1.id=table2.id)”进行关联。由此可见,在本公开实施例中,table1中只需要取出一行数据中需要查询的数据列。而如果直接将sql语句001提交进行查询的情况下,table1按照自己的查询过滤条件需要查询出三行数据。根据该示例可以清晰地看出,根据本公开实施例的方法可以明显地降低多表关联join操作的数据量减少,提高数据查询效率。图4示意性示出了根据本公开另一实施例的操作s250中从每个数据表各自的与候选关联数据列对应的记录中进行数据查询的流程图。如图4所示,根据该实施例操作s250可以包括操作s401~操作s403。在操作s401,以m个数据表中除第一数据表之外的每个数据表作为一个第二数据表,在每个第二数据表的查询过滤条件中追加新的查询过滤条件。通过新的查询过滤条件,将对每个第二数据表的数据查询范围限制在该候选关联数据列对应的记录内。在一个实施例中,可以首先获取第二数据表基于其自己的查询过滤条件确定出的记录中关联式查询操作所依据的字段的数据列,得到待比较关联数据列。例如,对于sql语句001,可以根据table1的查询过滤条件age>50确定出所要查询的记录中id字段的值为1、2、和3,即待比较关联数据列id={1,2,3}。然后基于待比较关联数据列与候选关联数据列的对比,设置新的查询过滤条件。例如,将待比较关联数据列id={1,2,3}和候选关联数据列id={2,4}进行对比发现,在查询table1的时候,没有必要取出id=1和3的数据。这样,可以在sql语句001中able1的查询过滤条件age>50的基础上,追加新的查询过滤条件如id≠1和id≠3。接下来将新的查询过滤条件追加到第二数据表的查询过滤条件中。在操作s402,基于每个第二数据表的追加的新的查询过滤条件,修改第一查询语句,得到第二查询语句。例如,sql语句001经过修改后的sql语句002可以是:selecttable1.name,table2.scorefromtable1jointable2on(table1.id=table2.id)wheretable1.(age>50,andid≠1,andid≠3),andtable2.score>90.2.在操作s403,按照第二查询语句(例如,sql语句002)进行数据查询,得到最终查询结果。根据本公开实施例得到的第二查询语句,实质上是针对join条件的谓词下沉pdp-pushdownpredicate。把小表的join条件所依据的数据列作为候选关联数据列,并广播到其他要关联的数据表。并依据候选关联数据列的数据在每个表的filter增加过滤条件,使其他每个数据表的查询范围都限制在候选关联数据列对应的记录范围内,从而使原本在join进行的部分数据筛选提前到各个数据表的filter段。在一个实施例中,追加新的查询过滤条件、以及生成第二sql语句中涉及对sql语句的解析,可以通过抽象语法树来实现。例如操作s402中在每个第二数据表的查询过滤条件中追加新的查询过滤条件,具体可以是在第一抽象语法树中,在每个第二数据表的查询过滤条件中追加新的查询过滤条件,得到第二抽象语法树。然后在操作s403中基于第二抽象语法树,反向生成第二查询语句。图5a示意性示出了根据本公开一实施例的第一抽象语法树500a的示意图。图5b示意性示出了将图5a所示的第一抽象语法树500a修改为第二抽象语法树500b的示意图。对比图5a和图5b,在第一抽象语法树500a中table1的filter501a中的查询过滤条件为age>50。而在第二抽象语法树500b中,table1的filter501b中的查询过滤条件在age>50的基础上,又追加了id≠1和id≠3这两个新的查询过滤条件。然后基于第二抽象语法树500b可以反向生成sql语句002。可以理解,以上举例的sql语句001和sql语句002中涉及的数据表、以及数据量都比较小,仅是为了示例性说明本公开实施例的原理。在实际执行中,当查询涉及的数据表以及数据量比较大时,追加的新的查询过滤条件也可能比较多,在这种情况下也可以对查询过滤条件进行适当的合并等处理,以精简查询表达式。图6示意性示出了将根据本公开实施例的数据查询方法应用于列式存储数据库clickhouse的一个应用实例的流程图。需要理解的是,该流程图仅是将将根据本公开实施例的数据查询方法应用于列式存储数据库clickhouse的一个示例性描述,并不对本公开构成任何限定。如图6所示,该应用实例可以包括操作s601~操作s615。在操作s601,用户在列式存储数据库clickhouse的集成环境中提交sql查询语句(即,第一查询语句)。clickhouse的ide有很多开源支持,比如dbeaver。在操作s602,拦截该sql查询语句,而非直接提交到clickhouse执行。在操作s603,用sparksql开源sql分析器生成sql抽象语法树(即,第一抽象语法树)。clickhouse的sql语法不是sql92标准,但符合标准ast,就是可以容易的用一些开源sql支持,如sparksqlcatalyst生成语法树,在操作s604,解析语法树中的join段,并根据解析结果判断是否存在join操作。如果不存在,则在操作s605中将用户输入的sql查询语句提交给clickhouse执行。如果存在,则执行操作s606所在的另一分支操作。在操作s605,将用户输入的sql查询语句提交给clickhouse执行。在操作s606,按照语法树生成rbo(rule-basedoptimization,基于规则的优化方法)逻辑执行计划。在操作s607,在逻辑执行计划的filter段以及join段读取字段以及表达式,对join段条件作谓词下沉(pushdownpredicate,pdp),沉到相应的数据表的rbo中。具体地谓词下沉的过程可以参考操作s401,通过将对一些数据表追加查询过滤条件,将用于查询过滤的谓词操作提前到每个数据表的查询过滤条件中,可以使对每个数据表的查询数据量减少,进而使得join操作的数据量减少。在操作s608,对于谓词下沉后的每个join的数据表table、以及条件filter做类似cbo(costbasedoptimization,基于代价的优化方式)识别,判段扫描的行数。经过谓词下沉后的数据表的sql所对应的查询行数尚属于纯语义层面的执行计划,还没有cbo。再此需要借助一个技术,clickhouse的执行计划没有暴露api,但是在clickhouse的日志中存在。将经过谓词下沉的filter反向生成抽象语法树,然后反向生成sql(即,第二查询语句,然后把这个sql提交给clickhouse预执行(为了不对clickhouse造成不必要的性能影响,仅仅预执行)。同时,在clickhouse的节点日志信息推送消息队列收集,获取执行计划的explain,通过该explain可以获取到经过谓词下沉之后的sql语句(即第二查询语句)对应的cbo。在该cbo中,clickhouse根据单表sql显示出会扫哪些列,这些列会从哪些分片扫。根据这个信息可以推算出clickhouse的扫描行数。在操作s609,判断经过谓词下沉后的cbo是否超出clickhouse的max_rows_in_join的限制。如果没有超出,则执行分支操作s610~操作s611;如果超出,则执行分支操作s612~操作s615。在操作s610,如果经过谓词下沉后的cbo中扫描行数没有超出限制,则根据谓词下沉,反向修改之前生成的抽象语法树。在各个数据表的filter段中增加查询过滤条件,得到第二抽象语法树。并根据第二抽象语法树反向生成sql(即,第二查询语句)。在操作s611,将第二抽象语法树提交给clickhouse执行。在操作s612,如果经过谓词下沉后的cbo中扫描行数超出限制,则创建作业,生成临时表。根据clickhouse的max_rows_in_join的设定,切分查询。在操作s613,生成切分条件将谓词下沉后的rbo反向生成的抽象语法树(即,第二抽象语法树)进行切分,生成多个抽象语法树,其中,每个抽象语法树的查询行数均不超出max_rows_in_join的限制。在操作s614,针对切分得到的多个抽象语法树,反向生成多个sql,并将每个sql分别提交clickhouse。在操作s615,将多个切分后的sql查询得到的结果合并到临时表,得到最终查询结果,并反馈给客户端。图7示意性示出了根据本公开实施例的数据查询装置700的框图。如图7所示,该数据查询装置700包括查询语句获取模块710、查询行数获取模块720、最小表确定模块730、关联列获取模块740、以及数据查询模块750。该装置700可以用于实现参考图2~图6所描述的方法。查询语句获取模块710例如可以执行操作s210,用于获取第一查询语句,第一查询语句包括对m个数据表中的数据的关联式查询操作,其中,m为大于等于2的整数。查询行数获取模块720例如可以执行操作s220,用于根据m个数据表中每个数据表的查询过滤条件,获取每个数据表的查询行数。最小表确定模块730例如可以执行操作s230,用于基于每个数据表的查询行数,从m个数据表中确定出查询行数最小的一个数据表,其中,以查询行数最小的数据表作为第一数据表。关联列获取模块740例如可以执行操作s240,用于获取第一数据表基于其自己的查询过滤条件确定出的记录中关联式查询操作所依据的字段的数据列,得到候选关联数据列,其中,一个记录为数据表中的一行。数据查询模块750例如可以执行操作s250,用于基于分别从m个数据表各自的与候选关联数据列对应的记录中进行数据查询,得到最终查询结果。根据本公开的一个实施例,数据查询模块750可以包括过滤条件追加子模块、查询语句修改子模块、以及查询子模块。其中,过滤条件追加子模块用于以m个数据表中除第一数据表之外的每个数据表作为一个第二数据表,在每个第二数据表的查询过滤条件中追加新的查询过滤条件。查询语句修改子模块用于基于每个第二数据表的新的查询过滤条件,修改第一查询语句,得到第二查询语句。查询子模块用于按照第二查询语句进行数据查询,得到最终查询结果。根据本公开的另一实施例,数据查询模块750可以包括中间结果获得子模块、以及关联子模块。其中,中间结果获得子模块用于分别按照m个数据表各自的查询过滤条件,从各自的数据表中的与候选关联数据列对应的记录中进行数据查询,得到与m个数据表一一对应的m个中间查询结果。关联子模块与用于将m个中间查询结果基于关联查询操作进行关联,得到最终查询结果。根据本公开的实施例的模块、子模块、单元、子单元中的任意多个、或其中任意多个的至少部分功能可以在一个模块中实现。根据本公开实施例的模块、子模块、单元、子单元中的任意一个或多个可以被拆分成多个模块来实现。根据本公开实施例的模块、子模块、单元、子单元中的任意一个或多个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(fpga)、可编程逻辑阵列(pla)、片上系统、基板上的系统、封装上的系统、专用集成电路(asic),或可以通过对电路进行集成或封装的任何其他的合理方式的硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,根据本公开实施例的模块、子模块、单元、子单元中的一个或多个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。例如,查询语句获取模块710、查询行数获取模块720、最小表确定模块730、关联列获取模块740、以及数据查询模块750中的任意多个可以合并在一个模块中实现,或者其中的任意一个模块可以被拆分成多个模块。或者,这些模块中的一个或多个模块的至少部分功能可以与其他模块的至少部分功能相结合,并在一个模块中实现。根据本公开的实施例,查询语句获取模块710、查询行数获取模块720、最小表确定模块730、关联列获取模块740、以及数据查询模块750中的至少一个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(fpga)、可编程逻辑阵列(pla)、片上系统、基板上的系统、封装上的系统、专用集成电路(asic),或可以通过对电路进行集成或封装的任何其他的合理方式等硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,查询语句获取模块710、查询行数获取模块720、最小表确定模块730、关联列获取模块740、以及数据查询模块750中的至少一个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。图8示意性示出了适于实现根据本公开实施例的数据查询方法的电子设备800的方框图。图8示出的电子设备800仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。如图8所示,根据本公开实施例的电子设备800包括处理器801,其可以根据存储在只读存储器(rom)802中的程序或者从存储部分808加载到随机访问存储器(ram)803中的程序而执行各种适当的动作和处理。处理器801例如可以包括通用微处理器(例如cpu)、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(asic)),等等。处理器801还可以包括用于缓存用途的板载存储器。处理器801可以包括用于执行根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。在ram803中,存储有电子设备800操作所需的各种程序和数据。处理器801、rom802以及ram803通过总线804彼此相连。处理器801通过执行rom802和/或ram803中的程序来执行根据本公开实施例的方法流程的各种操作。需要注意,所述程序也可以存储在除rom802和ram803以外的一个或多个存储器中。处理器801也可以通过执行存储在所述一个或多个存储器中的程序来执行根据本公开实施例的方法流程的各种操作。根据本公开的实施例,电子设备800还可以包括输入/输出(i/o)接口805,输入/输出(i/o)接口805也连接至总线804。电子设备800还可以包括连接至i/o接口805的以下部件中的一项或多项:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至i/o接口805。可拆卸介质811,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。根据本公开的实施例,根据本公开实施例的方法流程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质811被安装。在该计算机程序被处理器801执行时,执行本公开实施例的电子设备800中限定的上述功能。根据本公开的实施例,上文描述的系统、设备、装置、模块、单元等可以通过计算机程序模块来实现。本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的方法。根据本公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。例如,根据本公开的实施例,计算机可读存储介质可以包括上文描述的rom802和/或ram803和/或rom802和ram803以外的一个或多个存储器。附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本公开中。特别地,在不脱离本公开精神和教导的情况下,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合。所有这些组合和/或结合均落入本公开的范围。以上对本公开的实施例进行了描述。但是,这些实施例仅仅是为了说明的目的,而并非为了限制本公开的范围。尽管在以上分别描述了各实施例,但是这并不意味着各个实施例中的措施不能有利地结合使用。本公开的范围由所附权利要求及其等同物限定。不脱离本公开的范围,本领域技术人员可以做出多种替代和修改,这些替代和修改都应落在本公开的范围之内。当前第1页12当前第1页12
技术特征:
1.一种数据查询方法,包括:获取第一查询语句,所述第一查询语句包括对m个数据表中的数据的关联式查询操作,其中,m为大于等于2的整数;根据所述m个数据表中每个数据表的查询过滤条件,获取所述每个数据表的查询行数;基于所述每个数据表的查询行数,从所述m个数据表中确定出查询行数最小的一个数据表,其中,以所述查询行数最小的数据表作为第一数据表;获取所述第一数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到候选关联数据列,其中,一个记录为数据表中的一行;以及基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果。2.根据权利要求1所述的方法,其中,所述获取第一查询语句包括:接收用户输入的所述第一查询语句;解析所述第一查询语句,得到所述第一查询语句对应的第一抽象语法树;以及从所述第一抽象语法树中得到所述m个数据表、所述m个数据表中每个数据表的查询过滤条件、以及所述关联式查询操作。3.根据权利要求1或2所述的方法,其中,所述基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果包括:以所述m个数据表中除所述第一数据表之外的每个数据表作为一个第二数据表,在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件;基于每个所述第二数据表的所述新的查询过滤条件,修改所述第一查询语句,得到第二查询语句;以及按照所述第二查询语句进行数据查询,得到所述最终查询结果。4.根据权利要求3所述的方法,其中,所述在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件包括:获取所述第二数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到待比较关联数据列;基于所述待比较关联数据列与所述候选关联数据列的对比,设置所述新的查询过滤条件;以及将所述新的查询过滤条件追加到所述第二数据表的查询过滤条件中。5.根据权利要求3所述的方法,其中:所述在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件包括:在所述第一抽象语法树中,在每个所述第二数据表的查询过滤条件中追加新的查询过滤条件,得到第二抽象语法树;则,所述基于每个所述第二数据表的追加的查询过滤条件,修改所述第一查询语句,得到第二查询语句包括:基于所述第二抽象语法树,反向生成所述第二查询语句。6.根据权利要求1所述的方法,其中,所述基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果包括:分别按照所述m个数据表各自的查询过滤条件,从各自的数据表中的与所述候选关联
数据列对应的记录中进行数据查询,得到与所述m个数据表一一对应的m个中间查询结果;以及将所述m个中间查询结果基于所述关联查询操作进行关联,得到所述最终查询结果。7.根据权利要求6所述的方法,其中,所述分别按照所述m个数据表各自的查询过滤条件,从各自的数据表中的与所述候选关联数据列对应的记录中进行数据查询,得到与所述m个数据表一一对应的m个中间查询结果包括:按照所述第一数据表的查询过滤条件从所述第一数据表中查询出第一中间查询结果;以及以所述m个数据表中除所述第一数据表之外的每个数据表作为一个第二数据表,按照每个第二数据表的查询过滤条件从所述第二数据表中的所述候选关联数据列所在的记录中查询出一个第二中间查询结果,其中,从m-1个所述第二数据表中对应查询出m-1个所述第二中间查询结果;其中,所述m个中间查询结果包括所述第一中间查询结果和m-1个所述第二中间查询结果。8.根据权利要求1所述的方法,其中,所述方法应用于列式存储数据库。9.一种数据查询装置,包括:查询语句获取模块,用于获取第一查询语句,所述第一查询语句包括对m个数据表中的数据的关联式查询操作,其中,m为大于等于2的整数;查询行数获取模块,用于根据所述m个数据表中每个数据表的查询过滤条件,获取所述每个数据表的查询行数;最小表确定模块,用于基于所述每个数据表的查询行数,从所述m个数据表中确定出查询行数最小的一个数据表,其中,以所述查询行数最小的数据表作为第一数据表;关联列获取模块,用于获取所述第一数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到候选关联数据列,其中,一个记录为数据表中的一行;以及数据查询模块,用于基于分别从所述m个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果。10.一种电子设备,包括:一个或多个存储器,其上存储有计算机可执行指令;一个或多个处理器,所述处理器执行所述指令,以实现根据权利要求1~8中任一项所述的方法。11.一种计算机可读存储介质,其上存储有可执行指令,该指令被处理器执行时使处理器执行根据权利要求1~8中任一项所述的方法。
技术总结
本公开提供了一种数据查询方法。所述方法包括:获取第一查询语句,所述第一查询语句包括对M个数据表中的数据的关联式查询操作;根据所述M个数据表中每个数据表的查询过滤条件,获取所述每个数据表的查询行数;基于所述每个数据表的查询行数,从所述M个数据表中确定出查询行数最小的一个数据表,其中,以所述查询行数最小的数据表作为第一数据表;获取所述第一数据表基于其自己的查询过滤条件确定出的记录中所述关联式查询操作所依据的字段的数据列,得到候选关联数据列;以及基于分别从所述M个数据表各自的与所述候选关联数据列对应的记录中进行数据查询,得到最终查询结果。本公开还提供了一种数据查询装置、一种电子设备及计算机可读存储介质。子设备及计算机可读存储介质。子设备及计算机可读存储介质。
技术研发人员:关毛毛 吕军 程建波
受保护的技术使用者:京东科技控股股份有限公司
技术研发日:2020.11.23
技术公布日:2022/5/25
转载请注明原文地址:https://tc.8miu.com/read-15281.html