CN109716321B - N路散列连接 - Google Patents

N路散列连接 Download PDF

Info

Publication number
CN109716321B
CN109716321B CN201780056805.XA CN201780056805A CN109716321B CN 109716321 B CN109716321 B CN 109716321B CN 201780056805 A CN201780056805 A CN 201780056805A CN 109716321 B CN109716321 B CN 109716321B
Authority
CN
China
Prior art keywords
connection
partition
join
instructions
tables
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.)
Active
Application number
CN201780056805.XA
Other languages
English (en)
Other versions
CN109716321A (zh
Inventor
A·埃莫
A·维特科夫斯基
S·邦达拉帕蒂
S·苏布拉马安妮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Oracle International Corp
Original Assignee
Oracle International Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Oracle International Corp filed Critical Oracle International Corp
Publication of CN109716321A publication Critical patent/CN109716321A/zh
Application granted granted Critical
Publication of CN109716321B publication Critical patent/CN109716321B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • G06F16/24542Plan optimisation
    • G06F16/24544Join order optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2255Hash tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24553Query execution of query operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24553Query execution of query operations
    • G06F16/24554Unary operations; Data partitioning operations

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Software Systems (AREA)
  • Operations Research (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本文描述了用于处理包括指定多个表的连接的查询的技术。这些技术涉及通过将行分配给分区来对表进行划分。可以生成一个或多个分区映射来指示分区。可以基于生成的分区映射对后续表进行划分。分区可以用于确定连接的结果。

Description

N路散列连接
技术领域
本发明涉及查询处理技术,更具体而言,涉及用于处理多路散列连接的计算机实现的技术。
背景技术
数据库服务器通常接收需要执行被称为“连接操作”的一类操作的命令。连接操作用于组合多个表,因此可以在查询中选择那些表中的数据。连接两个表的查询指定如何使用一个或多个连接标准连接表。一般而言,连接操作包括将第一表中的每一行与第二表的与连接标准匹配的每一行合并。例如,查询可以指定,仅在第一表中的行在特定列中具有与第二表中的行的特定列中的值匹配的值时,第一表中的行才与第二表中的行连接。包含确定第一表的哪些行与第二表的哪些行连接的值的对应列被称为“连接键”。
数据库服务器可以依赖于被称为“散列连接”的算法来高效地执行连接操作。“散列连接”操作通常包括两个阶段。在被称为“构建阶段”的第一阶段中,数据库服务器通过根据针对连接键的散列函数对第一表的每一行进行散列来生成散列表。在被称为“探测阶段”的第二阶段中,数据库服务器迭代地扫描第二表的每一行。对于第二表中的每一行,数据库服务器使用散列函数和散列表来识别第一表中具有等效连接键值的行。当匹配的行被识别时,这些行被合并并且被添加到连接操作的结果集中。
散列连接操作一次合并两个表。对于指定多于两个表的连接的查询,查询优化器可以确定连接表对的顺序。可以使用散列连接利用表各自的连接键合并每对表,以产生中间结果。中间结果可以与其它表或其它中间结果合并以产生查询结果。但是,如果连接操作中的表相对较大,则数据库服务器可能无法将中间连接结果安排在易失性存储器中。在这种情况下,必须将中间连接结果的部分或全部写入到存储盘。从盘读取和写入所需的时间比仅从易失性存储器读取和写入的结果要长。
本节中描述的方法是可以追求的方法,但不一定是先前已经构思或追求的方法。因此,除非另有说明,否则不应认为本节中描述的任何方法仅仅因为它们包含在本节中就有资格作为现有技术。
附图说明
在附图中:
图1是图示示例分区映射的框图。
图2是图示数据库集群的系统架构的框图;
图3是图示用于处理多路连接的步骤的流程图;
图4是图示示例数据库表的框图;
图5是图示两个表的分区的框图;
图6是图示两个表的分区映射的框图;
图7是图示表的分区和分区映射的框图;
图8是图示表的分区的框图;
图9是图示可以用于实现本文描述的技术的计算机系统的框图。
具体实施方式
在以下描述中,出于解释的目的,阐述了许多具体细节以便提供对本发明的透彻理解。但是,显而易见的是,可以在没有这些具体细节的情况下实践本发明。在其它情况下,以框图形式示出了众所周知的结构和设备,以避免不必要地模糊本发明。
总体概述
描述了用于使用多路散列连接来处理查询中的多路连接的技术。根据各种实施例,数据库服务器实例识别接收到的查询中的多路连接。数据库服务器实例基于散列函数或一个或多个分区映射将多路连接中指定的每个表的行分配给一个或多个分区。
对于使用散列函数划分的表,根据针对分区键的散列函数将行分配给分区。可以基于分区为表生成一个或多个分区映射。如果根据连接列对表进行划分,则分区映射指示对于表中的第二列哪些分区具有包含该列的每个值的行。可以将第二列指定为多路连接中的后续连接标准中的连接键。
参考图1,图1图示了其行已被分配给分区的表。表T100有两列,C1和C2。假设表100已经基于列C1被划分为102处指示的分区。基于分区102和列C2生成分区映射104。例如,行(1,2)被分配给分区1,因此分区映射104指示可以在分区1处找到C2值2。
通过基于为先前划分的表创建的分区映射将行分配给分区,可以使用分区映射来对表进行划分。如果先前分区的表通过连接标准与第二表连接,则使用为先前划分的表创建的分区映射对第二表进行划分。行中的分区键的值可以用于索引分区映射并确定哪些分区被映射到该值。
参考图1,假设利用连接“table100.C2=table120.C3”将表120与表100连接。表120的列C3中的值用于索引表100的分区映射104。例如,对于表120的行(1,3),值1用于索引分区映射104。分区映射104指示在分区4中找到值1,因此行(1,3)也被分配给分区4,如在122处所指示的。作为另一个示例,对于表120的行(2,4),值2用于索引分区映射104。分区映射104指示在分区1中找到值2。因此,行(2,4)被分配给分区1。
通过基于其它表如何被分区来分配每个表的行,可能满足连接查询的行被分配给相同的分区。
系统概述
图2描绘了可以在其上实现实施例的多节点数据库系统。在图2所示的实施例中,系统200包括四个节点202、212、222和232。虽然在本图示中示出了四个节点,但是在其它实施例中,系统200可以包括更少或更多的节点。
节点202、212、222和232中的每个节点都可以访问相同的数据库260。出于说明的目的,数据库260被示出为存储在单个共享盘250上,但是在替代实施例中可以跨节点202、212、222和232中的每个节点可以访问的多个盘分布。
节点202、212、222和232分别具有一个或多个处理器208、218、228和238,以及本地易失性存储器204、214、224和234。此外,节点202、212、222、232和232分别正在执行数据库服务器实例206、216、226和236。虽然在所示实施例中每个节点正在执行单个数据库服务器实例,但是在替代实施例中,单个节点可以执行多于一个数据库服务器实例。
多路连接
数据库查询可以包括被称为“多路连接”的连接操作的类型。多路连接是连接多个表的连接操作。具有多路连接的查询可以指定要连接在一起的多个表,以及用于连接该多个表的多个连接标准。每个连接标准可以包括一对表和用于合并该对表的连接键。连接标准也可以包括一个或多个连接条件。
在实施例中,多路连接中的每个连接标准将表与多路连接中的下一个表连接。例如,假设数据库包括表T1、T2和T3。连接表T1、T2和T3的多路连接查询可以指定三个连接标准:第一连接T1和T2、第二连接T2和T3,以及第三连接T3和T1。因此,每个连接标准都具有与查询中在它之前或之后出现的连接标准共同的表。
在多路连接中指定的多个表不需要都是不同的表。多路连接可以包括一个或多个自连接。“自连接”将表的行与同一个表中的其它行合并。例如,具有雇员信息的表T4可以包括列“employee_id”和“supervisor_id”。表T4的自连接可以用于确定哪些雇员是其它雇员的主管(supervisor)。当一行的“employee_id”的值等于T4中第二行的“supervisor_id”的值时,自连接可以指定T4的行应该被合并。
出于图示清楚示例的目的,同一个表的实例在本文中可以被称为不同的表。例如,当诸如e1和e2的别名可以是同一个表的实例时,它们在本文中被描述为两个表。“别名”是用于引用查询中的表的替代名称。
不是使用连续的散列连接来处理多路连接,而是可以使用“多路散列连接”来处理多路连接。多路散列连接是对多路连接中的所有表进行散列并且然后将它们组合以输出结果的散列连接,而不是在单个操作中仅组合两个表。如下面进一步详细解释的,多路散列连接将每个表划分成可以存储在存储器中的连接分区。
每个数据库服务器实例206、216、226和236可以接收查询并确定查询执行计划。数据库服务器实例可以接收查询并确定该查询包括多个连接标准,每个连接标准可以使用散列连接来处理。数据库服务器实例可以选择多路散列连接而不是一系列散列连接来处理多个连接标准。
在实施例中,可以使用多路散列连接来执行查询。接收到的查询可以包括通过连接标准连接的多个表(其中每个连接标准将表与多路连接中的下一个表连接),以及不将表与多路连接中的另一个表连接的其它连接谓词或连接标准。数据库服务器实例可以迭代地将多路连接中的每个连接标准添加到要用多路散列连接处理的连接标准列表。
连接分区
为了使用多路散列连接来连接多个表,可以将多个表中的每个表划分成被称为“连接分区”的一个或多个组。可以将连接分区存储在节点的存储器中,诸如本地存储器204、214、224和234,或者存储在盘上,诸如共享盘250。在实施例中,连接分区主要存储在节点的本地易失性存储器中。如果存储器中分配的空间不足以保持连接分区的数据,则部分或全部连接分区可以存储在盘上。在实施例中,如果没有足够的存储器来存储连接分区的所有数据,则整个连接分区被移动到盘中。
在一些实施例中,用于多路散列连接的分区的数量基于多路连接的基数(cardinality)。数据库系统计算多路连接的估计基数。连接的基数指示结果中的行数。多路连接的估计基数可以基于包括多路连接的每个连接的基数。在实施例中,分区的数量等于多路连接的基数。
在实施例中,每个表的行被分配给一个或多个连接分区。如果行被分配给特定连接分区,则该特定连接分区可以包括该行的副本。可以基于被称为“分区键”的对应列中的值将行分配给分区。当连接标准在连接键上连接两个表时,每个表的相应连接键可以用作用于划分每个表的分区键。例如,对于连接标准“T1.ColA=T2.ColB”,连接键对于表T1是ColA并且对于表T2是ColB。ColA可以用作用于分区表T1的分区键,并且ColB可以用作用于分区表T2的分区键。
可以使用散列函数将表中的行分配给分区。散列函数应用于行的分区键列中的值。基于散列函数的结果,将行分配给对应的分区。可以将相同的散列函数应用于多路连接中的每个表的相应分区键。如下面进一步详细描述的,可以基于其它表中的行如何被分配给分区来将行分配给多于一个分区。在实施例中,连接分区存储在节点的本地存储器中。如果行被分配给多于一个分区,则它可以多次存储在存储器中,用于它被分配给的每个分区。
在实施例中,使用散列函数来对多路连接的前两个表进行划分。可以基于分区映射对剩余的表进行划分,如下面进一步详细解释的。
分区映射
如果表将在后续连接中与其它表连接,则当该表被分区时基于后续连接标准为该表创建分区映射。分区映射指示对于表,该表的每一行所属的一个或多个分区。可以基于表的行已经被分配给的分区来生成表的分区映射。如果使用第一列作为分区键将表的行分配给分区,则可以基于第二列中的值和表中行的分区分配来创建分区映射。用于生成分区映射的第二列可以是在包括该表的后续连接标准中被指定为该表的连接键的列。如果表具有多个用作多路连接内的连接键的列,则可以为每个列生成分区映射。
分区映射中的条目指示,对于第二列的值,基于第二列,对应的(一个或多个)行所属的(一个或多个)分区。在实施例中,散列函数被应用于第二列中的值以在分区映射中创建对应的条目。
可以基于在划分多路连接中的其它表时先前创建的一个或多个分区映射来对表进行划分。假设连接标准在连接键上连接第一表和第二表,并且第一表是基于不同的连接标准和不同的连接键进行划分的。基于连接键为第一表创建与第一表的行被分配给的分区对应的分区映射。第二表的行可以利用连接键作为分区键并使用分区映射来进行划分。行的分区键列中的值用于在分区映射中查找对应的条目。如果在分区映射中找到该值,则将该行分配给分区映射的对应条目中指示的(一个或多个)分区。如果在分区映射中没有找到该值,则该行与第一表中的任何行都不匹配。该行可以被丢弃并不会分配给分区。
由于基于连接标准和其它表被分区的方式将行分配给分区,因此表的分区包含该表的可能潜在地与分配给同一分区的其它表的行合并的行。基于分区合并表减少了需要对正在被连接的表的行进行的比较次数。
在实施例中,使用散列函数对在多路连接查询中指定的前两个表进行划分。多路连接查询中的其余表基于分区映射进行划分。
处理概述
图3是图示根据实施例的由数据库系统执行以执行多路散列连接的步骤的框图。
在步骤300,数据库服务器实例接收包括多路连接的查询。数据库服务器实例可以解析查询以确定包括多路连接的查询的一部分,并选择使用多路散列连接的执行计划。
参考图4,数据库260包括表400。表400被称为“边缘”表。边缘表400表示有向图450中所示的边,其中列为“from_id”(Table400.C1)和“to_id”(Table400.C2)。“From_id”指示有向图450中的边的起始点,并且“to_id”指示边的终点。
假设系统200中的节点202处的数据库服务器实例206接收对表400的包括多路连接的以下查询:
SELECT count(*)FROM Table400e1,Table400e2,Table400e3,Table400e4
WHERE e1.C2=e2.C1
AND e2.C2=e3.C1
AND e3.C2=e4.C1
AND e4.C2=e1.C1
该查询使用别名来引用对表400的每个引用。在本示例中,别名e1、e2、e3和e4用于引用表400。因此,该查询包括指定具有以下四个连接标准的表400的四个自连接的多路连接:
·表e1和e2,利用e1的“to_id”列和e2的“from_id”列上的连接键;
·表e2和e3,利用e2的“to_id”列和e3的“from_id”列上的连接键;
·表e3和e4,利用e3的“to_id”列和e4的“from_id”列上的连接键;以及
·表e4和e1,利用e4的“to_id”列和e1的“from_id”列的连接键。
在步骤302处,数据库服务器实例206使用散列函数对多路连接的连接中涉及的前两个表进行划分。出于图示清楚示例的目的,假设使用四个分区来为接收到的查询分区表。将散列函数应用于值“1”导致将行分配给分区p1、将散列函数应用于值“2”导致将行分配给分区p2、将散列函数应用于值“3”导致将行分配给分区p3、将散列函数应用于值“4”导致将行分配给分区p4。
第一连接标准是“e1.C2=e2.C1”,因此多路连接中的前两个表是表e1和表e2。参考图5,它图示了表e1和e2的分区。出于图示的目的,假设与每个表对应的连接键被用作用于对相应表进行划分的分区键。
表e1的连接键是“to_id”列(e1.C2),因此“to_id”列被用作用于对表e1进行划分的分区键。散列函数应用于表e1中每行的“to_id”列中的值,以确定该行被分配给哪个分区。
行(1,2)在“to_id”列中的值为2,因此行(1,2)被分配给分区p2。行(2,3)在“to_id”列中的值为3,因此行(2,3)被分配给分区p3。行(3,4)在“to_id”列中的值为4,因此行(3,4)被分配给分区p4。行(4,1)在“to_id”列中的值为1,因此行(4,1)被分配给分区p1。行(3,2)在“to_id”列中的值为2,因此行(3,2)也被分配给分区p2。如表510所示,表e1的分区包含以下行:
·P1:(4,1)
·P2:(1,2),(3,2)
·P3:(2,3)
·P4:(3,4)
散列函数也应用于表e2,使用“from_id”作为分区键以确定表e2的每一行被分配给哪个分区。行(1,2)在“from_id”列中的值为1,因此行(1,2)被分配给分区p1。行(2,3)在“from_id”列中的值为2,因此行(2,3)被分配给分区p2。行(3,4)在“from_id”列中的值为3,因此行(3,4)被分配给分区p3。行(4,1)在“from_id”列中的值为4,因此行(4,1)被分配给分区p4。行(3,2)在“from_id”列中的值为3,因此行(3,2)被分配给分区p3。如表520所示,表e2的分区包含以下行:
·P1:(1,2)
·P2:(2,3)
·P3:(3,4),(3,2)
·P4:(4,1)
在步骤304处,数据库服务器实例106基于前两个表的分区生成分区映射。
参考图6,其图示了表e1和e2的分区映射。分区映射pm1是表e1的分区映射,并且分区映射pm2是表e2的分区映射。使用“to_id”列作为分区键对表e1进行划分。基于“from_id”列生成分区映射pm1,因为后续连接标准(e4.C2=e1.C1)使用“from_id”作为连接键将表与表e1连接。分区映射pm1指示,对于“from_id”的每个值,包含该列值的对应行被分配给的分区。
在本示例中,对于表e1的行(1,2),“from_id”值是1并且行(1,2)被分配给分区2。如图6中的行602所示,分区映射pm1中的行指示具有“from_id”值为1的行被分配给分区p2。
如果将具有相同列值的多个行分配给不同分区,则在分区映射中指示每个分区。例如,“from_id”值3对应于两行:行(3,4)和行(3,2)。行(3,4)被分配给分区p4,并且行(3,2)被分配给分区p2,因此分区映射pm1指示具有“from_id”值3的行被分配给分区p2和p4。
类似地,使用“from_id”列作为分区键对表e2进行划分。基于“to_id”列生成分区映射pm2,因为后续连接标准(e2.C2=e3.C1)使用“to_id”作为连接键将表与表e2连接。分区映射pm2指示,对于“to_id”的每个值,包含该列值的对应行被分配给的分区。
在步骤306处,数据库服务器实例106基于一个或多个生成的分区映射对一个或多个剩余表进行划分。
参考图7,其图示了表e3的分区分配和分区映射。表710指示分配给每个分区的行,并且基于“to_id”列中的分区和值为表e3生成分区映射pm3。
表e3在连接标准“e2.C2=e3.C1”中连接到表e2。如上所述,基于“to_id”列(e2.C2)为表e2生成分区映射pm2,并且分区映射pm2指示,对于“to_id”的每个值,对应行被分配给哪个分区。表e3可以使用“from_id”(e3.C2)作为分区键并且基于由分区映射pm2指示的映射来分区。
在本示例中,表e3的行(1,2)在“from_id”列中具有值1。使用值1在分区映射pm2中查找对应的分区。参考分区映射pm2,“to_id”列中的值1被映射到分区p4,因此表e3的行(1,2)也被分配给分区p4。
可以将行分配给多于一个分区。例如,行(2,3)在“from_id”列中具有值2。参考分区映射pm2,它指示值2被分配给分区p1和分区p3。因此,行(2,3)被分配给分区p1和分区p3两者。
如表710所示,表e3的分区包含以下行:
·P1:(2,3)
·P2:(3,4),(3,2)
·P3:(2,3),(4,1)
·P4:(1,2)
表e3通过连接标准“e3.C2=e4.C1”连接到表e4,因此也使用“to_id”列(e3.C2)基于表e3的分区行为表e3创建分区映射。
参考图8,表810图示了表e4的分区分配。表e4通过连接标准“e4.C2=e1.C1”连接到表e1,并通过连接标准“e3.C2=e4.C1”连接到表e3。已经为表e1创建了分区映射pm1并且为表e3创建了分区映射pm3。因此,表e4基于“to_id”列(e4.C2)、“from_id”列(e4.C1)两者以及pm1和pm3两者进行划分。
在实施例中,可以基于两个或更多个分区映射来过滤分区。如果基于第一分区映射将行分配给特定分区,但未基于第二分区映射将该行分配给该分区,则该行不会被分配给该特定分区。即,AND操作可以用在从多个分区映射导出的多个分区分配上,以便确定分区分配。
例如,基于分区映射pm1,行(1,2)被分配给分区p3。基于分区映射pm3,行(1,2)也被分配给分区p3。由于分区分配是相同的,因此表e4的行(1,2)被分配给分区p3。
作为对照,基于分区映射pm1,行(3,4)被分配给分区p1。但是,基于分区映射mp3,行(3,4)被分配给分区p1和p3。由于只有分区p1是共同的,因此表4的行(3,4)仅被分配给分区p1。
如果基于分区映射没有共同的分区,则该行可以被过滤掉并且根本不被分配给分区。例如,基于分区映射pm1,行(3,2)被分配给分区p2和p4。基于分区映射pm3,行(3,2)被分配给分区p1。由于没有共同的分区,因此行(3,2)未被分配给任何分区并且未在表810中示出。
在一些实施例中,多路连接中的最后一个表的行被分区但不与分区中的其它行一起存储在存储器中。而是,这些行直接用于查找和返回多路连接的结果。在实施例中,如果分区存储在盘上,则分配给该分区的行仍然存储到盘上。
在步骤308处,数据库服务器实例206基于每个表的分区确定多路连接的结果。如果分区的部分或全部存储在盘上,则从盘中读取该分区。
如果第一表通过连接标准连接到第二表,则将第一表的行与第二表的行进行比较,以确定行是否满足连接标准。在实施例中,仅比较分配给相同分区的行。
在本示例中,分区p1包含:
·对于表e1:(4,1)
·对于表e2:(1,2)
·对于表e3:(2,3)
·对于表e4:(3,4)
在实施例中,散列表用于在分区中查找匹配的行。可以基于多路连接查询中的连接标准来创建散列表,然后使用每个表中的行来探测用于对应连接标准的散列表。利用对应的连接键作为散列键创建每个散列表。
在本示例中,可以创建三个散列表:
·e1上的散列表,用于连接标准“e1.C2=e2.C1”和“e4.C2=e1.C1”,其中e1.C2和e1.C1作为键
·e2上的散列表,用于连接标准“e2.C2=e3.C1”,其中e2.C1作为键
·e3上的散列表,用于连接标准“e3.C2=e4.C1”,其中e3.C2作为键
在实施例中,为每个表的每个分区创建散列表。因此,表e1上的分区1的散列表将仅包含表e1中被分配给分区1的行,表e2上的分区1的散列表将仅包含表e2中被分配给分区1的行,以此类推。
在实施例中,将最后一个表中的行与前一个表中的行进行比较。然后,可以使用前一个表中满足连接标准的行来迭代地检查包含该表的任何前面的连接标准,直到已检查所有表。对于特定行,如果在所有的表中都找到对应的行,则可以合并行并返回结果。
表e4是在多路连接中指定的最后一个表,因此首先选择表e4的行(3,4)。行(3,4)用于基于连接标准“e3.C2=e4.C1”检查表e3的分区p1。值3将被散列以探测表e3的散列表。这返回表e3的行(2,3)的结果。行(2,3)用于基于连接标准“e2.C2=e3.C1”检查表e2的分区p1。值2用于探测表e2的散列表。这返回表e2的行(1,2)的结果。表e2的行(1,2)和表e4的行(3,4)用于基于连接标准“e1.C2=e2.C1”和“e4.C2=e1.C1”检查表e1的分区p1。对于表e4,值4将被散列,并且对于表e2,值1将被散列。两者都返回表e1的行(4,1)的结果。由于对于所有探测都找到行,因此找到结果并且可以返回该结果。
分布式处理
在一些实施例中,可以由单个节点接收特定查询,但是然后可以将查询的工作分布到集群中的多个节点。可以分配表的每一行并将其发送到节点以处理查询。
可以使用散列函数将行分配给节点。散列函数可以应用于行的列中的值,诸如包括表的连接标准中的连接键。基于散列函数的结果,行被分配给对应的节点。
在实施例中,使用散列函数将多连接查询中的前两个表分布到集群中的节点。可以基于分布映射来分布剩余的表。
分布映射指示,对于表,该表的每一行被发送到哪个节点。如果基于第一列将表的行分布到节点,则可以基于第二列和节点分配来创建分布映射,类似于上面描述的用于创建分区映射的处理。分布映射中的条目指示,对于特定列的值,(一个或多个)对应行被分配给的节点。
在以上示例中,假设节点202上的数据库服务器实例206接收包括多路连接的查询。数据库服务器实例206不是自己处理多路散列连接,而是通过将每个表的行分配给节点202、212、222和232中的一个或多个来划分多路散列连接的工作。在实施例中,可以在一个或多个处理器208、218、228和238之间进一步划分工作。
假设将散列函数应用于值1将把该行分配给节点202,将散列函数应用于值2将把该行分配给节点212,将散列函数应用于值3将把该行分配给节点222,并且将散列函数应用于值4将把该行分配给节点232。
可以基于第一连接标准的连接键将表e1的行分配给节点。散列函数应用于表e1中每行的“to_id”列中的值,以确定将行发送到哪个节点。
行(1,2)在“to_id”列中的值为2,因此行(1,2)被分配给节点212。行(2,3)在“to_id”列中的值为3,因此行(2,3)被分配给节点222。行(3,4)在“to_id”列中的值为4,因此行(3,4)被分配给节点232。行(4,1)在“to_id”列中的值为1,因此行(4,1)被分配给节点202。行(3,2)在“to_id”列中的值为2,因此行(3,2)也被分配给节点212。
基于表e1的行的节点分配生成分布映射。分布映射可以基于后续连接标准中的连接键,诸如连接标准“e4.C2=e1.C1”的“from_id”列。表e1的分布映射将指示值为1的“from_id”被分配给节点212,值为2的“from_id”被分配给节点222,值为3的“from_id”被分配给节点212和232,并且值为4的“from_id”被分配给节点202。类似于如上所述的对表进行划分,可以基于表e1和e3的分布映射将表e4的行发送到节点202、212、222和232。
如上所述,每个节点为其分配的行执行多路散列连接。节点可以在它们已完成处理多路散列连接之后将结果发送回数据库服务器实例。
硬件概述
根据一个实施例,本文描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行所述技术,或者可以包括诸如被永久性地编程以执行所述技术的一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA)的数字电子设备,或者可以包括编程为按照固件、存储器、其它存储装置或者其组合中的程序指令执行所述技术的一个或多个通用硬件处理器。这种专用计算设备还可以合并定制的硬连线逻辑、ASIC或FPGA与定制的编程来实现所述技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者结合硬连线和/或程序逻辑来实现所述技术的任何其它设备。
例如,图9是图示本发明的实施例可以在其上实现的计算机系统900的框图。计算机系统900包括总线902或者用于传送信息的其它通信机制,以及与总线902耦合用于处理信息的硬件处理器904。硬件处理器904可以是例如通用微处理器。
计算机系统900还包括耦合到总线902用于存储信息和要由处理器904执行的指令的主存储器906,诸如随机存取存储器(RAM)或其它动态存储设备。主存储器906还可以用于在要由处理器904执行的指令执行期间存储临时变量或其它中间信息。当存储在处理器904可访问的非瞬态存储介质中时,这种指令使计算机系统900变成为执行指令中所规定的操作而定制的专用机器。
计算机系统900还包括只读存储器(ROM)908或者耦合到总线902的其它静态存储设备,用于为处理器904存储静态信息和指令。提供了存储设备910,诸如磁盘、光盘或固态驱动器,并且耦合到总线902,用于存储信息和指令。
计算机系统900可以经总线902耦合到显示器912,诸如阴极射线管(CRT),用于向计算机用户显示信息。输入设备914(包括字母数字和其它键)耦合到总线902,用于向处理器904传送信息和命令选择。另一种类型的用户输入设备是游标控件916,诸如鼠标、轨迹球或者游标方向键,用于向处理器904传送方向信息和命令选择并且用于控制显示器912上的游标运动。这种输入设备通常具有在两个轴(第一轴(例如,x)和第二轴(例如,y))中的两个自由度,这允许设备在平面内规定位置。
计算机系统900可以利用定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑来实现本文所述的技术,这些与计算机系统相结合,使计算机系统900或者把计算机系统900编程为专用机器。根据本发明的一种实施例,本文的技术由计算机系统900响应于执行包含在主存储器906中的一条或多条指令的一个或多个序列的处理器904而执行。这种指令可以从另一存储介质,诸如存储设备910,读到主存储器906中。包含在主存储器906中的指令序列的执行使处理器904执行本文所述的处理步骤。在备选实施例中,硬连线的电路系统可以代替软件指令或者与其结合使用。
如在本文所使用的,术语“存储介质”是指存储使机器以特定方式操作的数据和/或指令的任何非瞬态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘、磁盘或固态驱动器,诸如存储设备910。易失性介质包括动态存储器,诸如主存储器906。存储介质的常见形式包括,例如,软盘、柔性盘、硬盘、固态驱动器、磁带,或者任何其它磁性数据存储介质,CD-ROM,任何其它光学数据存储介质,任何具有孔模式的物理介质,RAM、PROM和EPROM、FLASH-EPROM、NVRAM,任何其它存储器芯片或盒式磁带。
存储介质与传输介质不同但是可以与其结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线902的配线。传输介质还可以采取声或光波的形式,诸如在无线电波和红外线数据通信中产生的那些。
各种形式的介质可以参与把一条或多条指令的一个或多个序列携带到处理器904供执行。例如,指令初始地可以在远端计算机的磁盘或固态驱动器上携带。远端计算机可以把指令加载到其动态存储器中并且利用调制解调器经电话线发送指令。位于计算机系统900本地的调制解调器可以在电话线上接收数据并且使用红外线发送器把数据转换成红外线信号。红外线检测器可以接收在红外线信号中携带的数据并且适当的电路系统可以把数据放在总线902上。总线902把数据携带到主存储器906,处理器904从该主存储器906检索并执行指令。由主存储器906接收的指令可以可选地在被处理器904执行之前或之后存储在存储设备910上。
计算机系统900还包括耦合到总线902的通信接口918。通信接口918提供耦合到网络链路920的双向数据通信,其中网络链路920连接到本地网络922。例如,通信接口918可以是综合业务数字网络(ISDN)卡、电缆调制解调器、卫星调制解调器,或者提供到对应类型的电话线的数据通信连接的调制解调器。作为另一个示例,通信接口918可以是提供到兼容的局域网(LAN)的数据通信连接的LAN卡。无线链路也可以实现。在任何此类实现中,通信接口918都发送和接收携带表示各种类型信息的数字信号流的电、电磁或光信号。
网络链路920通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路920可以通过本地网络922提供到主计算机924或者到由互联网服务提供商(ISP)926操作的数据设备的连接。ISP 926继而通过现在通常称为“互联网”928的全局分组数据通信网络提供数据通信服务。本地网络922和互联网928都使用携带数字数据流的电、电磁或光信号。通过各种网络的信号以及在网络链路920上并通过通信接口918的信号是传输介质的示例形式,其中信号把数字数据带到计算机系统900或者携带来自计算机系统900的数字数据。
计算机系统900可以通过(一个或多个)网络、网络链路920和通信接口918发送消息和接收数据,包括程序代码。在互联网示例中,服务器930可以通过互联网928、ISP 926、本地网络922和通信接口918发送对应于程序的所请求代码。
接收到的代码可以在其被接收到时由处理器904执行,和/或存储在存储设备910或其它非易失性存储装置中,用于以后执行。
在前面的说明书中,本发明的实施例已经参考众多的具体细节进行了描述,这些细节可以因实现方案而异。因此,说明书和附图被认为是说明性的而不是限制性的。本发明的范围的唯一且排他指示,以及申请人所预期的作为本发明的范围的内容,是从本申请产生的权利要求集合的书面和等效范围,这是以这种权利要求产生的具体形式,包括任何后续的校正。

Claims (24)

1.一种用于多路连接的方法,所述方法包括:
在数据库系统处接收包括多路连接的查询,所述多路连接包括多个连接操作,所述多个连接操作的每个连接操作涉及相应第一表的相应第一连接键和相应第二表的相应第二连接键;
其中,所述多个连接操作包括第一连接操作、第二连接操作和第三连接操作;
对于第一连接操作:
基于所述第一连接操作的所述相应第一连接键,将第一连接操作的相应第一表划分成多个分区;
生成将包含在第二连接操作的相应第一连接键中的值映射到所述多个分区的第一分区映射,第二连接操作的所述相应第一连接键是所述第一连接操作的相应第一表的列;
基于所述第一连接操作的所述相应第二连接键,将第一连接操作的相应第二表划分成所述多个分区;
生成将包含在第三连接操作的相应第一连接键中的值映射到所述多个分区的第二分区映射,第三连接操作的所述相应第一连接键是所述第一连接操作的相应第二表的列;
基于第一分区映射和所述第二连接操作的相应第二连接键,对所述第二连接操作的相应第二表进行划分;
基于第二分区映射和所述第三连接操作的相应第二连接键,对第三连接操作的相应第二表进行划分。
2.如权利要求1所述的方法,其中,对第一连接操作的相应第一表和相应第二表进行划分包括:
将散列函数应用于相应第一连接键;以及
将散列函数应用于相应第二连接键。
3.如权利要求1所述的方法,还包括:
生成映射包含在第三连接操作的相应第二连接键中的值的第三分区映射,所述第三连接操作的所述相应第二连接键是所述第二连接操作的相应第二表的列;
基于第二分区映射和第三分区映射对第三连接操作的相应第二表进行划分。
4.如权利要求3所述的方法,还包括:
基于第二分区映射和第三分区映射,对第三连接操作的相应第二表的一行或多行进行过滤。
5.如权利要求1所述的方法,还包括:将所述多个分区存储在数据库系统的本地存储器中。
6.如权利要求5所述的方法,还包括:如果数据库系统的本地存储器不能整个地存储分区,则将所述分区存储在盘中。
7.如权利要求1所述的方法,其中数据库系统是多节点数据库系统,所述方法还包括:
将第一连接操作的相应第一表和相应第二表的行分配给多节点数据库系统的一个或多个节点;
根据所述分配,生成分布映射;
基于分布映射,将第二连接操作和第三连接操作的相应第一表和相应第二表的行分配给多节点数据库系统中的所述一个或多个节点;以及
所述一个或多个节点中的每个节点对于分配给该节点的表执行所述划分和生成。
8.如权利要求7所述的方法,还包括:将所述多个分区存储在所述一个或多个节点的相应本地存储器中。
9.如权利要求8所述的方法,还包括:如果相应本地存储器不能整个地存储分区,则将所述分区存储在共享盘中。
10.如权利要求1所述的方法,还包括:基于所述多个分区,确定多路连接的结果。
11.如权利要求10所述的方法,其中确定多路连接的结果还包括:
基于第一连接操作的相应第二表和第一连接操作的相应第二连接键生成第一散列表;
基于第二连接操作的相应第一表和第二连接操作的相应第一连接键生成第二散列表;
其中,基于第一散列表和第二散列表确定结果。
12.存储指令的一个或多个非瞬态计算机可读介质,其中所述指令包括:
当由一个或多个硬件处理器执行时,使得在数据库系统处接收包括多路连接的查询的指令,所述多路连接包括多个连接操作,所述多个连接操作的每个连接操作涉及相应第一表的相应第一连接键和相应第二表的相应第二连接键;
其中,所述多个连接操作包括第一连接操作、第二连接操作和第三连接操作;
当由一个或多个硬件处理器执行时,使得对于第一连接操作执行以下的指令:
基于所述第一连接操作的所述相应第一连接键,将第一连接操作的相应第一表划分成多个分区;
生成将包含在第二连接操作的相应第一连接键中的值映射到所述多个分区的第一分区映射,第二连接操作的所述相应第一连接键是所述第一连接操作的相应第一表的列;
基于所述第一连接操作的所述相应第二连接键,将第一连接操作的相应第二表划分成所述多个分区;
生成将包含在第三连接操作的相应第一连接键中的值映射到所述多个分区的第二分区映射,第三连接操作的所述相应第一连接键是所述第一连接操作的相应第二表的列;
当由一个或多个硬件处理器执行时,使得基于第一分区映射和所述第二连接操作的相应第二连接键对所述第二连接操作的相应第二表进行划分的指令;
当由一个或多个硬件处理器执行时,使得基于第二分区映射和所述第三连接操作的相应第二连接键对第三连接操作的相应第二表进行划分的指令。
13.如权利要求12所述的一个或多个非瞬态计算机可读介质,其中,对第一连接操作的相应第一表和相应第二表进行划分还包括:
将散列函数应用于相应第一连接键;以及
将散列函数应用于相应第二连接键。
14.如权利要求12所述的一个或多个非瞬态计算机可读介质,所述指令还包括:
当由一个或多个硬件处理器执行时,使得生成映射包含在第三连接操作的相应第二连接键中的值的第三分区映射的指令,所述第三连接操作的所述相应第二连接键是所述第二连接操作的相应第二表的列;
当由一个或多个硬件处理器执行时,使得基于第二分区映射和第三分区映射对第三连接操作的相应第二表进行划分的指令。
15.如权利要求14所述的一个或多个非瞬态计算机可读介质,所述指令还包括:
当由一个或多个硬件处理器执行时,使得基于第二分区映射和第三分区映射对第三连接操作的相应第二表的一行或多行进行过滤的指令。
16.如权利要求12所述的一个或多个非瞬态计算机可读介质,还包括:当由一个或多个硬件处理器执行时,使得将所述多个分区存储在数据库系统的本地存储器中的指令。
17.如权利要求16所述的一个或多个非瞬态计算机可读介质,还包括:当由一个或多个硬件处理器执行时,使得如果数据库系统的本地存储器不能整个地存储分区,则将所述分区存储在盘中的指令。
18.如权利要求12所述的一个或多个非瞬态计算机可读介质,其中数据库系统是多节点数据库系统,所述指令还包括:
当由一个或多个硬件处理器执行时,使得将第一连接操作的相应第一表和相应第二表的行分配给多节点数据库系统的一个或多个节点的指令;
当由一个或多个硬件处理器执行时,使得基于分配生成分布映射的指令;
当由一个或多个硬件处理器执行时,使得基于分布映射将第二连接操作和第三连接操作的相应第一表和相应第二表的行分配给多节点数据库系统中的所述一个或多个节点的指令;以及
当由一个或多个硬件处理器执行时,使得所述一个或多个节点中的每个节点对于分配给该节点的表执行所述划分和生成的指令。
19.如权利要求18所述的一个或多个非瞬态计算机可读介质,还包括:当由一个或多个硬件处理器执行时,使得将所述多个分区存储在所述一个或多个节点的相应本地存储器中的指令。
20.如权利要求19所述的一个或多个非瞬态计算机可读介质,还包括:当由一个或多个硬件处理器执行时,使得如果相应本地存储器不能整个地存储分区,则将所述分区存储在共享盘中的指令。
21.如权利要求12所述的一个或多个非瞬态计算机可读介质,还包括:当由一个或多个硬件处理器执行时,使得基于所述多个分区确定多路连接的结果的指令。
22.如权利要求21所述的一个或多个非瞬态计算机可读介质,其中确定多路连接的结果还包括:
当由一个或多个硬件处理器执行时,使得基于第一连接操作的相应第二表和第一连接操作的相应第二连接键生成第一散列表的指令;
当由一个或多个硬件处理器执行时,使得基于第二连接操作的相应第一表和第二连接操作的相应第一连接键生成第二散列表的指令;
其中,基于第一散列表和第二散列表确定结果。
23.一种计算机系统,包括:
处理器;以及
存储器,所述存储器存储了指令,所述指令在被处理器执行时使处理器执行如权利要求1至11中任一项所述的方法。
24.一种用于多路连接的装置,所述装置包括用于执行如权利要求1至11中任一项所述的方法的步骤的部件。
CN201780056805.XA 2016-09-15 2017-07-17 N路散列连接 Active CN109716321B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/266,751 2016-09-15
US15/266,751 US10733186B2 (en) 2016-09-15 2016-09-15 N-way hash join
PCT/US2017/042319 WO2018052519A1 (en) 2016-09-15 2017-07-17 N-way hash join

Publications (2)

Publication Number Publication Date
CN109716321A CN109716321A (zh) 2019-05-03
CN109716321B true CN109716321B (zh) 2023-07-28

Family

ID=59501540

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201780056805.XA Active CN109716321B (zh) 2016-09-15 2017-07-17 N路散列连接

Country Status (4)

Country Link
US (1) US10733186B2 (zh)
EP (1) EP3513306B1 (zh)
CN (1) CN109716321B (zh)
WO (1) WO2018052519A1 (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11500931B1 (en) * 2018-06-01 2022-11-15 Amazon Technologies, Inc. Using a graph representation of join history to distribute database data
CN110008238B (zh) * 2019-03-12 2021-04-27 北京东方国信科技股份有限公司 Nlj改进表连接方法及基于该改进方法的数据查询方法
EP3885929A4 (en) * 2019-09-11 2022-02-09 Huawei Technologies Co., Ltd. METHOD, DEVICE AND SYSTEM FOR DATA REDISTRIBUTION
US11126401B2 (en) 2019-09-18 2021-09-21 Bank Of America Corporation Pluggable sorting for distributed databases
US11016978B2 (en) 2019-09-18 2021-05-25 Bank Of America Corporation Joiner for distributed databases
US12067019B2 (en) 2021-11-30 2024-08-20 Snowflake Inc. Dynamic data restriction in a database clean room

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104685496A (zh) * 2012-09-28 2015-06-03 甲骨文国际公司 关系型数据库管理系统中删减聚类表的磁盘块
CN109729115A (zh) * 2017-10-30 2019-05-07 北京临风云科技有限公司 实现分布式计算的方法、装置、代理服务器、终端设备

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7882100B2 (en) * 2005-01-24 2011-02-01 Sybase, Inc. Database system with methodology for generating bushy nested loop join trees
US8086593B2 (en) * 2007-03-01 2011-12-27 Microsoft Corporation Dynamic filters for relational query processing
US9740735B2 (en) * 2007-11-07 2017-08-22 Microsoft Technology Licensing, Llc Programming language extensions in structured queries
US7925656B2 (en) * 2008-03-07 2011-04-12 International Business Machines Corporation Node level hash join for evaluating a query
KR101296683B1 (ko) * 2011-03-23 2013-08-14 연세대학교 산학협력단 데이터 스트림에서의 다중 조인 질의 처리를 위한 2 페이즈 수행 방법
US9355146B2 (en) * 2012-06-29 2016-05-31 International Business Machines Corporation Efficient partitioned joins in a database with column-major layout
US10896178B2 (en) * 2016-03-30 2021-01-19 Microsoft Technology Licensing, Llc High performance query processing and data analytics

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104685496A (zh) * 2012-09-28 2015-06-03 甲骨文国际公司 关系型数据库管理系统中删减聚类表的磁盘块
CN109729115A (zh) * 2017-10-30 2019-05-07 北京临风云科技有限公司 实现分布式计算的方法、装置、代理服务器、终端设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
"Multi-Way Hash Join Effectiveness";Michael Henderson;《"Multi-Way Hash Join Effectiveness"31 July2013,pages1-51,XP055399860,Okanagan, British Columbia Canada,https://cmps-people.ok.ubc.ca/rlawrenc/research/Students/MH_13_Thesis.pdf》;20130731;摘要、第19页-20页 *

Also Published As

Publication number Publication date
US10733186B2 (en) 2020-08-04
US20180075101A1 (en) 2018-03-15
CN109716321A (zh) 2019-05-03
EP3513306B1 (en) 2020-11-04
EP3513306A1 (en) 2019-07-24
WO2018052519A1 (en) 2018-03-22

Similar Documents

Publication Publication Date Title
CN109716321B (zh) N路散列连接
US10628449B2 (en) Method and apparatus for processing database data in distributed database system
US10275184B2 (en) Framework for volatile memory query execution in a multi node cluster
US10067954B2 (en) Use of dynamic dictionary encoding with an associated hash table to support many-to-many joins and aggregations
EP3058690B1 (en) System and method for creating a distributed transaction manager supporting repeatable read isolation level in a mpp database
US10452655B2 (en) In-memory cursor duration temp tables
CN109906447B (zh) 管理请求数据库系统中不存在的索引键的事务
CN108519862A (zh) 区块链系统的存储方法、装置、系统和存储介质
JP2017224331A (ja) 個別のデータ値に対する効率よい演算を行うための方法、装置、並びにコンピュータ可読媒体
US11249973B2 (en) Querying partitioned tables in a distributed database
US11954117B2 (en) Routing requests in shared-storage database systems
US11086868B2 (en) Materialized view rewrite technique for one-sided outer-join queries
CN104881466A (zh) 数据分片的处理以及垃圾文件的删除方法和装置
CN104391913A (zh) 一种数据库管理方法及装置
CN109241100B (zh) 一种查询方法、装置、设备及存储介质
CN114090695A (zh) 分布式数据库的查询优化的方法和装置
US20120330988A1 (en) Systems And Methods For Performing Index Joins Using Auto Generative Queries
US10482076B2 (en) Single level, multi-dimension, hash-based table partitioning
US20150178328A1 (en) Client-Side Directed Commands to a Loosely Coupled Database
US7188113B1 (en) Reducing contention by slaves for free lists when modifying data in a table partition
CN113836238A (zh) 数据命令的批量处理方法及装置
US10353920B2 (en) Efficient mirror data re-sync
US11860906B2 (en) Partition-local partition value identifier grouping
CN109388638B (zh) 用于分布式大规模并行处理数据库的方法及系统
CN112835888A (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
GR01 Patent grant
GR01 Patent grant