CN113468178B - 一种关联表的数据分区装载方法与装置 - Google Patents
一种关联表的数据分区装载方法与装置 Download PDFInfo
- Publication number
- CN113468178B CN113468178B CN202110766468.1A CN202110766468A CN113468178B CN 113468178 B CN113468178 B CN 113468178B CN 202110766468 A CN202110766468 A CN 202110766468A CN 113468178 B CN113468178 B CN 113468178B
- Authority
- CN
- China
- Prior art keywords
- partition
- node
- data
- loading
- value
- 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
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/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
-
- 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/23—Updating
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种关联表的数据分区装载方法与装置,引入树形数据结构,当对主表进行数据分区装载时,基于数据的分区键值计算分区值,根据计算出的分区值分发数据并更新主表的分区映射缓存;当对附表进行数据分区装载时,基于数据在该附表与其父节点间的关联字段值从其父节点的分区映射缓存中获取分区值,根据获取到的分区值分发数据并更新该附表的分区映射缓存;对于每个节点,分区映射缓存保存数据在该节点与其子节点间的关联字段值以及对应分区值的映射关系。本方案中每条数据只需在根节点计算一次分区值,减少计算开销;整个装载过程所有表只需遍历读取一次,且不需要进行排序、表连接等操作,减少资源消耗与读取开销。
Description
【技术领域】
本发明属于数据装载技术领域,更具体地,涉及一种关联表的数据分区装载方法与装置。
【背景技术】
对于两张表A和B,假设B中的每条数据在一个或多个字段的值,在A中必定存在一条数据在对应字段上的值相同,则A表称为主表,B表称为附表,A表和B表形成关联表,对应字段称为关联字段。其中,主表A能够有多个附表,附表B也能有自己的附表,但附表只能有一个主表,形成多级关联表。如果将关联表之间的关联关系用树结构表示,则主表是根节点,附表均为子节点,其中主表的直接附表是根节点的子节点,不同的直接附表之间是兄弟节点关系,是一级节点;附表的附表是二级节点,以此类推,形成一个树结构,没有附表的表是叶子节点,根节点与叶子节点之间的是中间节点,即子节点分为中间节点和叶子节点。
数据分区是指一张表里的数据依据分区值划分成多份,分别存放到多个数据库的表里,分区值是分区函数基于一个或多个字段值计算得到的,用于计算分区值的字段称为分区键,每条数据里分区键字段对应的值称为分区键值,关联字段与分区键可能不相同也可能相同。应用信息***后端数据库的数据数量增大到一定程度时会严重影响信息***的访问速度,一种高性价比的改进思路是采用分布式数据库中间件实现数据的“分库分表”,后端数据库服务由单一数据库改为多个数据库,应用服务程序通过数据库中间件间接地访问后端数据库服务。“分库分表”演进方案是将源数据库中的数据分区装载到多个数据库,具体是用分区函数和分区规则计算出每条数据所在分区,然后利用分区装载程序将每条数据分发到对应的分区数据库节点,以实现数据分区,如图1所示。
常规情形下每张待分区的数据表都会指定分区键,利用分区键值、分区函数和分区规则即可计算出该条数据所在分区的分区值,但有主附表关联关系的附表不一定直接具有分区键,因此附表需要通过其主表的分区键确定其分区值,附表的附表更是如此。以购物***中的订单表和订单详情表为例,结合图2和图3,订单表(Order)是主表,详情表(Detail)是附表,详情表中的ORDER_ID字段与订单表中的ID字段关联,订单表中的TIME字段是分区键,根据每条订单数据中的TIME值(即分区键值)可计算对应订单数据的分区值。例如,按订单生成年份将订单表分区,同一年产生的订单划分为一个区,订单详情数据与其依附的订单数据需要分到同一个分区数据库,因为在查询订单时需要查询订单下的所有购买商品,如果订单与其对应的订单详情不在一个分区,就需要跨分区查询订单的详细信息,跨分区查询效率就低了。但是,详情表中不直接包含创建订单的时间字段,只能通过ORDER_ID从订单表中关联得到TIME值,进而间接获得分区值。
在数据“分库分表”的设计模式中,所有关联表的数据分区必须放在同一个分区数据库,附表的数据分区跟随主表的数据分区,这样做在关联查询时会有最好的性能。主表数据有分区键,根据分区键可以直接计算出分区值,而与主表数据关联的附表以及附表之附表的关联数据,都需要依靠主表的分区值确定其分区。特殊情形下,关联字段与分区键相同,也可以考虑通过关联关系从主表获取分区值。那么,关联表分区装载的核心问题就是如何确定附表、附表之附表数据的分区值。
首先抽象出一个多级关联表的关联关系模型,如图4所示,表A是主表,其中的SHARDING字段是分区键;表B1、表B2、表B3是表A的附表,分别通过A_ID列与表A的ID列关联;表C1、表C2是表B1的附表,分别通过B1_ID列与表B1的ID列关联;表D1是表C2的附表,通过C1_ID列与表C2的ID列关联。在图4所示的关联关系模型中,有多个附表时,多个附表关联于主表的同一个字段,而更通用的模型则是不同的附表关联于主表的不同字段,如图5所示,表B1、表B2、表B3与主表A的关联字段分别是A_ID1、A_ID2、A_ID3,这种表关联设计对表达关联表的关联关系更加通用,因此本申请主要是基于这个更通用的模型来描述方法实现。
附表数据分区装载获取分区键值的直接实现思路是通过主附表“连接”操作获取分区键值,存在多级主附表关联关系时,则采用“链式连接”获取分区键值。“链式连接”指的是多级关联表中的附表与其主表或直接或间接地进行多次连接,是多级关联模型下获取附表分区键的基本方法。例如,在“主-附-附”表关联模式中,三级附表与二级附表连接获得二级附表与主表的关联字段值;然后二级附表与主表连接,最终从主表获取分区键值。
目前常规的ETL(Extract-Transform-Load,即抽取-转换-加载)软件实现关联表数据的分区装载时,通过“连接”操作获取附表依附主表的分区键值,或者通过“链式连接”获取多级附表依附的主表分区键值。通过SQL(Structured Query Language,即结构化查询语言)连接查询语句将“连接”或多级“链式连接”操作负载放在源数据库直接获取主表关联数据的分区键值,或者通过多个单表读取组件将待分区的附表、附表的父节点表,一直到主表,所有表的关联字段数据读进ETL软件,由ETL将数据进行“连接”或多级“链式连接”操作获取根节点主表关联数据的分区键值,再通过一个数据转换组件给数据追加一个表示数据分区值的字段,之后连接分发逻辑的转换组件,将数据分发到多个分区数据库的对应表里。处理过程的功能划分如图6所示,关联表的分区装载和常规表的分区装载是相同的处理过程:数据读取模块负责读取完整的数据,每条数据必须包含分区键值,常规表和关联表中的主表数据本身包含了分区键值,关联表中的附表通过“连接”或者“链式连接”操作得到分区键值;分区计算模块基于分区键值和分区函数为读取到的每条数据计算分区值;数据分发模块负责将数据分发到各分区数据库对应的数据表装载组件,将数据写入分区。
综上所述,目前方案中关联表的数据分区装载方法主要有以下缺陷:
表连接操作代价很大,不论是在数据库服务器,还是在ETL服务器,做数据表的连接操作需要的计算资源和内存资源都很大,特别是在数据量很大的情形下,而需要分区存储的表数据量一般刚好都非常大,如果存在多级关联表,通过数据库的“链式连接”获取分区键值,性能问题将更加突出,链接级数较多、表的数据量很大时,这种方法基本不可行;
基于“连接”实现分区装载方案,所有附表的分区装载都需要读取该附表节点所在树结构分支的上游父节点表和祖宗节点表(如果存在)的数据;在包含所有关联表的整个分区装载过程中,一个节点的数据会遍历读取多次,遍历的次数是该节点的所有子孙节点的个数加一,根节点主表被遍历读取的次数最多,存在数据重复读取的额外开销;
基于分区键值的计算会重复计算多次,主表和所有级别附表的每条数据进行分区装载时都会计算一次分区值,存在重复计算的额外开销;
利用现有ETL工具实现分区装载需要对每个关联表单独设计一个分区装载作业流程,附表的分区装载流程要比主表的复杂,且复杂程度随关联级别的增加而增大,叶子节点附表的分区装载流程最复杂。设计作业流程的工作量比较大,随着关联链条的增长而增大。
鉴于此,克服上述现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明提供了一种关联表的数据分区装载方法与装置,其目的在于通过分区映射缓存确定附表的分区值,由此解决传统通过连接方式实现分区装载时资源消耗大、数据重复读取和计算的额外开销大、分区装载流程复杂等技术问题。
为实现上述目的,按照本发明的一个方面,提供了一种关联表的数据分区装载方法,包括:
当对主表进行数据分区装载时,基于数据的分区键值计算数据的分区值,根据计算出的分区值分发数据并更新所述主表的分区映射缓存;
当对附表进行数据分区装载时,基于数据在该附表与其父节点间的关联字段值从其父节点的对应分区映射缓存中获取数据的分区值,根据获取到的分区值分发数据并更新该附表的分区映射缓存;
其中,对于每个节点,所述分区映射缓存用于保存数据在该节点与其子节点间的关联字段值以及对应分区值之间的映射关系。
优选地,所述主表的数据分区装载过程具体为:
从所述主表中进行数据读取,对每条数据基于所述主表中对应的分区键值计算对应的分区值,并根据计算出的分区值进行数据分发;
对所述主表的每个子节点,将每条数据在所述主表与该子节点间的关联字段值以及对应的分区值,以映射形式存入所述主表对应该子节点维护的分区映射缓存中。
优选地,所述附表的数据分区装载过程具体为:
从所述附表中进行数据读取,对每条数据基于数据在该附表与其父节点间的关联字段值,从其父节点对应该附表维护的分区映射缓存中获取对应的分区值,并根据获取到的分区值进行数据分发;
如果该附表存在子节点,则对该附表的每个子节点,将每条数据在该附表与其子节点间的关联字段值以及对应的分区值,以映射形式存入该附表对应该子节点维护的分区映射缓存中。
优选地,对于关联表中的任一节点,节点的数据分区装载完成后,所述方法还包括:
如果节点不存在子节点或节点的各子节点均已完成数据分区装载,则节点向其父节点提交释放对应分区映射缓存的请求。
优选地,对于关联表中的每个节点,该节点对应其每个子节点维护一个分区映射缓存,用于保存每条数据在该节点与对应子节点间的关联字段值以及对应分区值之间的映射关系;则当该节点收到其子节点提交的释放对应分区映射缓存的请求后,直接释放其对应该子节点维护的分区映射缓存。
优选地,对于关联表中的每个节点,该节点对应其每组关联子节点维护一个分区映射缓存,用于保存每条数据在该节点与对应关联子节点间的关联字段值以及对应分区值之间的映射关系;
该节点为自身维护的每个分区映射缓存设置计数,并将计数的初始值设为分区映射缓存对应的关联子节点个数;则每当该节点收到其子节点提交的释放对应分区映射缓存的请求后,将对应分区映射缓存的计数减一,当计数为零时释放其对应该组关联子节点维护的分区映射缓存。
优选地,在所述关联表的数据分区装载过程中,按照树形数据结构深度优先遍历的顺序对各节点进行数据分区装载,具体为:
以根节点对应的主表作为当前节点进行数据分区装载;
当前节点的数据分区装载完成后,判断当前节点是否存在子节点;
如果存在子节点,则选择任一子节点作为当前节点进行数据分区装载,装载完成后判断当前节点是否存在子节点;
如果不存在子节点,则当前节点向其父节点提交释放对应分区映射缓存的请求,并回溯到当前节点的父节点作为当前节点。
优选地,在所述回溯到当前节点的父节点作为当前节点之后,所述方法还包括:
当前节点根据接收请求的情况释放对应的分区映射缓存,并判断当前节点是否还存在尚未处理的子节点;
如果还存在尚未处理的子节点,则选择任一尚未处理的子节点作为当前节点进行数据分区装载,装载完成后判断当前节点是否存在子节点;
如果不存在尚未处理的子节点,则判断当前节点是否为根节点;如果是根节点则结束数据分区装载,如果不是根节点则当前节点向父节点提交释放对应分区映射缓存的请求,并回溯到当前节点的父节点作为当前节点。
优选地,在对所述主表进行数据分区装载之前,所述方法还包括:
分区装载程序在初始化时,根据关联关系构建关联表对应的树形数据结构,并为树形数据结构中的每个节点构建空的分区映射缓存;
其中,对于每个节点,分区装载程序对应该节点的每个子节点构建一个空的分区映射缓存,或对应该节点的每组关联子节点构建一个空的分区映射缓存。
按照本发明的另一方面,提供了一种关联表的数据分区装载装置,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成上述第一方面所述的关联表的数据分区装载方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:本发明在每个节点处均维护有分区映射缓存,主表进行数据分区装载时基于分区键值计算分区值,而附表进行数据分区装载时则基于数据在该附表与其父节点间的关联字段值从其父节点的对应分区映射缓存中获取分区值。在上述方案中,每条数据的分区值只需要在根节点主表处计算一次,其他所有附表处只需通过父节点的分区映射缓存即可获取,有效减少计算开销;整个装载过程中所有表只需要遍历读取一次,且只是单纯从数据库表中读出数据,不需要进行表连接或其它代价高昂的数据操作,减少资源消耗与数据重复读取开销;且通用性较强,能处理一对一和一对多关联表模型的分区装载。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是一种从源数据库到多个分区数据库的数据分区示意图;
图2是本发明实施例提供的一种作为主表的订单表示意图;
图3是本发明实施例提供的一种作为订单表附表的详情表示意图;
图4是本发明实施例提供的一种简单关联表的关联关系模型示意图;
图5是本发明实施例提供的一种通用关联关系模型示意图;
图6是传统方案中用于实现数据分区装载的分区装载模块示意图;
图7是本发明实施例提供的一种通用关联关系模型对应的树形数据结构和分区映射缓存的示意图;
图8是本发明实施例提供的一种带有映射缓存的分区装载模块示意图;
图9是本发明实施例提供的一种关联表的数据分区装载方法流程图;
图10是本发明实施例提供的一种按照树形数据结构深度优先遍历顺序进行数据分区装载的流程图;
图11是本发明实施例提供的一种关联表的数据分区装载装置架构图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明各实施例中,符号“/”表示同时具有两种功能的含义,而对于符号“A和/或B”则表明由该符号连接的前后对象之间的组合包括“A”、“B”、“A和B”三种情况。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1
为解决传统通过连接方式实现分区装载时资源消耗大、数据重复读取和计算的额外开销大、分区装载流程复杂等技术问题,本发明基于分区映射缓存提供了一种关联表的数据分区装载方法。而为了实现关联表的数据分区装载,在进行数据分区装载之前,即分区装载程序在初始化时,会先根据关联关系构建关联表对应的树形数据结构,并为树形数据结构中的每个节点构建空的分区映射缓存;其中,对于每个节点,分区装载程序对应该节点的每个子节点构建一个空的分区映射缓存,或对应该节点的每组关联子节点构建一个空的分区映射缓存。
本发明实施例主要对树形数据结构和分区映射缓存的构建进行介绍:
多级关联表可以在配置文件里设置,如XML格式表示的多表多级关联关系,通过读取配置文件可以在内存中构建一个树形数据结构,用于表示多级主附表之间的关联关系。其中,树的根节点是主表,主表是第一层的唯一节点;主表的直接关联附表是树结构的第二层,可称为二级关联节点;附表的附表是树的第三层,可称为三级关联节点;依次类推,第四层、四级关联节点等。每个父节点指向其所有子节点,每个子节点也拥有指针指向其父节点。
静态树形数据结构如图7所示,对应图5表示的通用表关联模型中的表名和主附表之间的关联关系和关联字段,父节点与子节点之间相互指向,分区装载代码执行过程中父子节点间可直接访问。其中,根节点A表为主表,主表A的直接关联附表B1、B2、B3为二级关联节点,附表B1的直接关联附表C1、C2为三级关联节点,附表C2的直接关联附表D1为四级关联节点。另外,节点B1、节点B2、节点B3与其父节点A的关联字段分别是A_ID1、A_ID2、A_ID3,节点C1、节点C2与其父节点B1的关联字段分别是B_ID1、B_ID2,节点D1与其父节点C2的关联字段为ID。
对于树形数据结构中的每个节点,如果节点存在子节点,则需要为该节点构建空的分区映射缓存,用于保存数据在该节点与其子节点间的关联字段值以及对应分区值之间的映射关系,每个子节点都对应一个key-value映射关系。对于各节点来说,映射关系的键值key就是数据在该节点与其子节点间的关联字段值,value值是数据的分区值,而该节点中数据的分区值则是从其父节点的分区映射缓存中得到,直到根节点主表。
在通用模型则中,不同的附表通常关联于主表的不同字段,即如果节点存在多个子节点,则各子节点的关联字段都不同,此时分区装载程序会对应该节点的每个子节点分别构建一个空的分区映射缓存,即一个子节点对应一个分区映射缓存,二者为一一对应关系。当然,也可能会存在某些关联字段相同的子节点,这些子节点也可称为该节点的关联子节点,在这种情况下,为节约内存,可适当减少分区映射缓存的数量,对应该节点的每组关联子节点构建一个空的分区映射缓存,即关联字段相同的子节点共享一个分区映射缓存。其中,如果节点与其某个子节点之间的关联字段有多个,则对应分区映射缓存中的key值可由多个关联字段上的取值按某种拼接规则合并而成。
如图7所示,根节点A表存在3个附表B1、B2、B3,且B1、B2、B3的关联字段不一样,则需要为节点A构建三个分区映射缓存,分别对应表B1、B2、B3;表B1存在2个附表C1、C2,且关联字段不一样,则需要为节点B1构建两个分区映射缓存,分别对应表C1、C2。以表A处构建的分区映射缓存<A_ID1,PARTITION>为例,A_ID1列用于存储每条数据在表A和表B1间的关联字段值,PARTITION列则用于存储每条数据对应的分区值;其余各分区映射缓存以此类推,在此不做赘述。
分区装载程序在初始化时,按照上述方法构建多级表关联模型的树形数据结构,以及树形数据结构中各节点的分区映射缓存,而分区映射缓存里的映射数据则是在关联表的数据分区装载过程中动态生成和释放,具体过程将在实施例2中展开介绍。
实施例2
在上述实施例1构建的树形数据结构以及分区映射缓存基础上,接下来就是按照如图6所示的分区装载过程中的模块划分和数据流动,按序进行表的数据读取、分区计算和数据分发。但由于增加了树形关联结构和分区映射缓存,特别是分区映射缓存,使获取数据分区值的方式有所改变,因此在图6中的“分区计算”模块增加了新的设计,演化后的分区装载模块划分如图8所示。
结合图9,本发明实施例提供的关联表的数据分区装载方法具体如下:
步骤101,当对主表进行数据分区装载时,基于数据的分区键值计算数据的分区值,根据计算出的分区值分发数据并更新所述主表的分区映射缓存。
继续参考图8,所述主表的数据分区装载过程具体为:首先从所述主表中进行数据读取,然后对每条数据基于所述主表中对应的分区键值计算对应的分区值,即图8中的“分区计算”,并根据计算出的分区值进行数据分发。同时,对所述主表的每个子节点,将每条数据在所述主表与该子节点间的关联字段值以及对应的分区值,以映射形式存入所述主表对应该子节点维护的分区映射缓存中。
步骤102,当对附表进行数据分区装载时,基于数据在该附表与其父节点间的关联字段值从其父节点的对应分区映射缓存中获取数据的分区值,根据获取到的分区值分发数据并更新该附表的分区映射缓存。
继续参考图8,所述附表的数据分区装载过程具体为:首先从所述附表中进行数据读取,然后对每条数据基于数据在该附表与其父节点间的关联字段值,从其父节点对应该附表维护的分区映射缓存中获取对应的分区值,即图8中的“映射缓存”,并根据获取到的分区值进行数据分发。同时,如果该附表存在子节点,则对该附表的每个子节点,将每条数据在该附表与其子节点间的关联字段值以及对应的分区值,以映射形式存入该附表对应该子节点维护的分区映射缓存中。
由上可知,根节点(即主表)的数据分区值与中间节点/叶子节点的数据分区值的获取方式完全不同:根节点中的数据拥有分区键,可直接根据分区键计算分区值;而中间节点和叶子节点的数据分区值通过父节点中维护的对应分区映射缓存间接获取,因此将图6中的“分区计算”功能模块演化成图8中的“分区值获取”模块,对应两种分区值获取方式。
对于关联表中除根节点主表以外的任一节点,例如图7中的表B1、B2、B3、C1、C2、D1,均可按照步骤102所述的方法进行数据分区装载。而对于任一节点,当节点的数据分区装载完成后,所述方法还包括:如果节点不存在子节点或节点的各子节点均已完成数据分区装载,则节点向其父节点提交释放对应分区映射缓存的请求,以便由其父节点释放对应分区映射缓存,节约***资源。
由实施例1可知,对于关联表中的每个节点,该节点可对应其每个子节点维护一个分区映射缓存,用于保存每条数据在该节点与对应子节点间的关联字段值以及对应分区值之间的映射关系,即子节点与分区映射缓存一一对应。在这种情况下,当该节点收到其任一子节点提交的释放对应分区映射缓存的请求后,该节点会直接释放其对应该子节点维护的分区映射缓存,达到节约***资源的目的。
进一步由实施例1可知,对于关联表中的每个节点,为节省分区映射缓存的数量,该节点还可对应其每组关联子节点维护一个分区映射缓存,用于保存每条数据在该节点与对应关联子节点间的关联字段值以及对应分区值之间的映射关系。在这种情况下,该节点会为自身维护的每个分区映射缓存设置计数,并将计数的初始值设为分区映射缓存对应的关联子节点个数;则每当该节点收到其子节点提交的释放对应分区映射缓存的请求后,便将对应分区映射缓存的计数减一,当计数为零时真正释放其对应该组关联子节点维护的分区映射缓存。
综上所述,本发明实施例提供的数据分区装载方法具有以下有益效果:
基于每条主表数据的分区键进行分区值计算,即每条数据的分区值只需要在根节点主表处计算一次,其他所有附表处只需通过父节点的分区映射缓存即可获取,有效减少分区值的计算开销;
整个装载过程中所有表的数据只需要遍历读取一次,且只是单纯从数据库表中读出数据,不需要进行表连接或其它代价高昂的数据操作,减少资源消耗与数据重复读取开销;
通用性较强,能处理任何复杂程度的表关联模块(一对一和一对多)的数据分区装载,在ETL软件里实现后设计分区装载作业只需要一个装载作业组件,配置只需要表关联模型信息、源数据库、分区数据库等基本信息,用户设计分区装载作业的工作量最小化,节省大量配置时间。
实施例3
在上述实施例2中,分别介绍了主表和附表的数据分区装载过程,而对于有多个表的关联表模型,通常是按照树形数据结构深度优先遍历的顺序,对树形数据结构中的各节点进行数据分区装载,参考图10,具体执行顺序如下:
步骤201,以根节点对应的主表作为当前节点进行数据分区装载,即先对主表进行数据分区装载,并更新主表维护的分区映射缓存。
步骤202,当前节点的数据分区装载完成后,判断当前节点是否存在子节点。其中,数据分区装载完成具体是指,当前节点的表中每条数据都已完成数据分发。
步骤203,如果存在子节点,则选择任一子节点作为当前节点进行数据分区装载,然后跳转至步骤202,即当前节点的数据分区装载完成后,判断当前节点是否存在子节点。
步骤204,如果不存在子节点,则当前节点向其父节点提交释放对应分区映射缓存的请求,并回溯到当前节点的父节点作为当前节点,然后向下执行步骤205。
步骤205,当前节点根据接收请求的情况释放对应的分区映射缓存。
步骤206,判断当前节点是否还存在尚未处理的子节点。
步骤207,如果还存在尚未处理的子节点,则选择任一尚未处理的子节点作为当前节点进行数据分区装载,然后跳转至步骤202,即当前节点的数据分区装载完成后,判断当前节点是否存在子节点。
步骤208,如果不存在尚未处理的子节点,则判断当前节点是否为根节点;如果是根节点则结束整个数据分区装载过程,如果不是根节点则跳转至步骤204,即当前节点向其父节点提交释放对应分区映射缓存的请求,并回溯到当前节点的父节点作为当前节点。也就是说,当前节点为根节点且没有尚未处理的子节点时,结束整个数据分区装载过程。
需要说明的是,对于任一当前节点,其具体装载过程可参考实施例2,具体如下:先从当前节点中进行数据读取,然后对每条数据基于数据在当前节点与其父节点间的关联字段值,从其父节点对应当前节点维护的分区映射缓存中获取对应的分区值,并根据获取到的分区值进行数据分发,同时更新当前节点维护的分区映射缓存。其中,所述更新当前节点维护的分区映射缓存具体为:当前节点存在子节点时,对当前节点的每个子节点,将每条数据在当前节点与其子节点间的关联字段值以及对应的分区值,以映射形式存入当前节点对应该子节点维护的分区映射缓存中。
另外需要说明的是,在步骤205中,当前节点释放分区映射缓存的过程同样可参考实施例2,具体分以下两种情况:
1)如果当前节点对应其每个子节点维护一个分区映射缓存,则当前节点收到其任一子节点提交的释放对应分区映射缓存的请求后,便会直接释放其对应该子节点维护的分区映射缓存。
2)如果当前节点对应其每组关联子节点维护一个分区映射缓存,则当前节点会为自身维护的每个分区映射缓存设置计数,并将计数的初始值设为分区映射缓存对应的关联子节点个数。每当当前节点收到其子节点提交的释放对应分区映射缓存的请求后,便将对应分区映射缓存的计数减一,当计数为零时真正释放其对应该组关联子节点维护的分区映射缓存。
由上述实施例可知,数据在装载过程中会缓存关联字段值和分区值至分区映射缓存中。为实现快速查询分区映射缓存获取到所需的分区值,可将所述分区映射缓存保存至内存;而当内存不足时或为了节约内存也可使用外缓存,即将所述分区映射缓存保存至本地外存。数据分区装载是按照树形数据结构深度优先遍历的特定顺序对表进行分区装载的,一次只会处理一个表,当内存不足时或为了节约使用内存,也可只将当前处理的表用到的分区映射缓存保存至内存,增加一次写IO和一次读IO操作即可。
进一步地,上述实施例中是以通用的表关联模型为主,按照树形数据结构深度优先遍历的特定顺序对表进行分区装载,而对于某些特定的简单的表关联模型,尤其是主表只存在一个附表,且分区键值与关联字段值具有一定相关性时,可考虑采用分段处理的方式进行数据装载,而无需一定将主表的所有数据都处理完后再处理附表的数据。分段处理方式如下:根据关联字段值将所述主表的数据划分为多段,优选为一段数据对应一个分区键值,然后按关联字段值的递增或递减顺序依次读取每一段数据;每当从所述主表中读取出一段数据后,根据该段数据对应的关联字段值查询附表中对应的数据,得到该段数据在附表中对应的所有数据,然后对主表和附表中获取的这些数据进行数据分区装载处理;处理完成后继续从所述主表中读取下一段数据进行处理。
以图2的订单表和图3的详情表为例,订单生成的时间随着订单号的增加而增加,即分区键值与关联字段值有正相关性,则根节点的订单表在执行分区装载时,不需要把订单表的所有数据处理完后再处理订单详情表,可以分段分批处理订单表的数据。例如,可根据订单ID将订单表的数据划分为多段,然后基于订单ID的顺序先读取一段订单数据,如订单ID1对应的一段订单数据;子节点的订单详情表会根据订单ID范围进行查询,得到订单ID为1时对应的所有订单详情数据,进而分批处理订单ID1对应的订单数据和订单详情数据。
通过上述分段处理方式,可以减少分区映射数据的缓存,但数据读取查询中增加了条件判断,会增加一部分查询开销,因此适用范围有限,不适合复杂的表关联模型,仅适用于表关联关系比较简单的表关联模型。对于复杂的表关联模型,仍可按照深度优先遍历的顺序进行装载。
实施例4
由上述实施例3可知,分区装载程序按照树形数据结构深度优先遍历的顺序,对树形数据结构中的各节点进行数据分区装载。为便于理解,本发明实施例进一步以图7所示的树形数据结构为例,对其数据分区装载的执行过程做如下详细描述:
1)将根节点A作为当前节点,读取根节点A的数据,每条数据根据分区键SHARDING字段的值计算对应分区值,根据分区值分发数据;当前节点A存在子节点,则更新A自身的分区映射缓存<A_ID1,PARTITION>、<A_ID2,PARTITION>、<A_ID3,PARTITION>,即对每条数据分别将关联字段A_ID1的值和分区值、A_ID2的值和分区值、A_ID3的值和分区值以映射形式写入对应的分区映射缓存。
2)当前节点是A,存在子节点,则选择其任一子节点B1作为当前节点,读取B1表的数据,对于每条数据,取出其A_ID1字段上的值,根据该值从其父节点A的分区映射缓存<A_ID1,PARTITION>中获取数据的分区值,根据分区值分发数据;同时,因当前节点B1存在子节点,则分别使用字段B_ID1、B_ID2的取值和数据分区值更新B1自身的分区映射缓存<B_ID1,PARTITION>、<B_ID2,PARTITION>。
3)当前节点是B1,存在子节点,选择其任一子节点C1作为当前节点执行数据分区装载;装载完毕后,由于C1没有子节点,则向其父节点B1提交释放分区映射缓存<B_ID1,PARTITION>的请求,并回溯到父节点B1作为当前节点。
4)当前节点是B1,存在尚未处理的子节点C2,则选择C2作为当前节点执行数据分区装载;同时,因当前节点C2存在子节点,则使用字段ID的取值和数据分区值更新C2自身的分区映射缓存<ID,PARTITION>。
5)当前节点是C2,存在子节点D1,则选择D1作为当前节点执行数据分区装载;装载完毕后,由于D1没有子节点,则向父节点C2提交释放分区映射缓存<ID,PARTITION>的请求,并回溯到父节点C2作为当前节点。
6)当前节点是C2,释放C2的分区映射缓存<ID,PARTITION>,由于C2不存在尚未处理的子节点,则回溯到父节点B1作为当前节点,同时向B1提交申请释放对应分区映射缓存<B_ID2,PARTITION>的请求。
7)当前节点是B1,释放B1的分区映射缓存<B_ID2,PARTITION>,由于B1不存在尚未处理的子节点,则回溯到父节点A作为当前节点,同时向A提交释放对应分区映射缓存<A_ID1,PARTITION>的请求。
8)当前节点是A,释放A的分区映射缓存<A_ID1,PARTITION>,由于A存在尚未处理的子节点,则选择任一尚未处理的子节点B2作为当前节点执行数据分区装载;装载完毕后,由于B2没有子节点,则向其父节点A提交释放对应分区映射缓存<A_ID2,PARTITION>的请求,并回溯到其父节点A作为当前节点。
9)当前节点是A,释放A的分区映射缓存<A_ID2,PARTITION>,由于A存在尚未处理的子节点B3,则选择B3作为当前节点执行数据分区装载;装载完毕后,由于B3没有子节点,则向其父节点A提交释放对应分区映射缓存<A_ID3,PARTITION>的请求,并回溯到其父节点A作为当前节点。
10)当前节点是A,释放A的分区映射缓存<A_ID3,PARTITION>,由于A不存在尚未处理的子节点,且A为根节点,则结束分区装载。
实施例5
在上述实施例1-实施例4提供的关联表的数据分区装载方法的基础上,本发明还提供了一种可用于实现上述方法的关联表的数据分区装载装置,如图11所示,是本发明实施例的装置架构示意图。本实施例的关联表的数据分区装载装置包括一个或多个处理器21以及存储器22。其中,图11中以一个处理器21为例。所述处理器21和所述存储器22可以通过总线或者其他方式连接,图11中以通过总线连接为例。
所述存储器22作为一种关联表的数据分区装载方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1-实施例4中的关联表的数据分区装载方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行关联表的数据分区装载装置的各种功能应用以及数据处理,即实现实施例1-实施例4的关联表的数据分区装载方法。
所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1-实施例4中的关联表的数据分区装载方法,例如,执行以上描述的图9和图10所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,RandomAccessMemory)、磁盘或光盘等。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种关联表的数据分区装载方法,其特征在于,主表下的直接附表表现为根节点下的子节点关系,附表下的附表两者对应表现为前者为后者的父节点关系,包括:
当对主表进行数据分区装载时,基于数据的分区键值计算数据的分区值,根据计算出的分区值分发数据并更新所述主表的分区映射缓存;
当对附表进行数据分区装载时,基于数据在该附表与其父节点间的关联字段值从其父节点的对应分区映射缓存中获取数据的分区值,根据获取到的分区值分发数据并更新该附表的分区映射缓存;
其中,对于每个节点,所述分区映射缓存用于保存数据在该节点与其子节点间的关联字段值以及对应分区值之间的映射关系。
2.如权利要求1所述的关联表的数据分区装载方法,其特征在于,所述主表的数据分区装载过程具体为:
从所述主表中进行数据读取,对每条数据基于所述主表中对应的分区键值计算对应的分区值,并根据计算出的分区值进行数据分发;
对所述主表的每个子节点,将每条数据在所述主表与该子节点间的关联字段值以及对应的分区值,以映射形式存入所述主表对应该子节点维护的分区映射缓存中。
3.如权利要求1所述的关联表的数据分区装载方法,其特征在于,所述附表的数据分区装载过程具体为:
从所述附表中进行数据读取,对每条数据基于数据在该附表与其父节点间的关联字段值,从其父节点对应该附表维护的分区映射缓存中获取对应的分区值,并根据获取到的分区值进行数据分发;
如果该附表存在子节点,则对该附表的每个子节点,将每条数据在该附表与其子节点间的关联字段值以及对应的分区值,以映射形式存入该附表对应该子节点维护的分区映射缓存中。
4.如权利要求1所述的关联表的数据分区装载方法,其特征在于,对于关联表中的任一节点,节点的数据分区装载完成后,所述方法还包括:
如果节点不存在子节点或节点的各子节点均已完成数据分区装载,则节点向其父节点提交释放对应分区映射缓存的请求。
5.如权利要求4所述的关联表的数据分区装载方法,其特征在于,对于关联表中的每个节点,该节点对应其每个子节点维护一个分区映射缓存,用于保存每条数据在该节点与对应子节点间的关联字段值以及对应分区值之间的映射关系;则当该节点收到其子节点提交的释放对应分区映射缓存的请求后,直接释放其对应该子节点维护的分区映射缓存。
6.如权利要求4所述的关联表的数据分区装载方法,其特征在于,对于关联表中的每个节点,该节点对应其每组关联子节点维护一个分区映射缓存,用于保存每条数据在该节点与对应关联子节点间的关联字段值以及对应分区值之间的映射关系;
该节点为自身维护的每个分区映射缓存设置计数,并将计数的初始值设为分区映射缓存对应的关联子节点个数;则每当该节点收到其子节点提交的释放对应分区映射缓存的请求后,将对应分区映射缓存的计数减一,当计数为零时释放其对应该组关联子节点维护的分区映射缓存。
7.如权利要求1-6任一所述的关联表的数据分区装载方法,其特征在于,在所述关联表的数据分区装载过程中,按照树形数据结构深度优先遍历的顺序对各节点进行数据分区装载,具体为:
以根节点对应的主表作为当前节点进行数据分区装载;
当前节点的数据分区装载完成后,判断当前节点是否存在子节点;
如果存在子节点,则选择任一子节点作为当前节点进行数据分区装载,装载完成后判断当前节点是否存在子节点;
如果不存在子节点,则当前节点向其父节点提交释放对应分区映射缓存的请求,并回溯到当前节点的父节点作为当前节点。
8.如权利要求7所述的关联表的数据分区装载方法,其特征在于,在所述回溯到当前节点的父节点作为当前节点之后,所述方法还包括:
当前节点根据接收请求的情况释放对应的分区映射缓存,并判断当前节点是否还存在尚未处理的子节点;
如果还存在尚未处理的子节点,则选择任一尚未处理的子节点作为当前节点进行数据分区装载,装载完成后判断当前节点是否存在子节点;
如果不存在尚未处理的子节点,则判断当前节点是否为根节点;如果是根节点则结束数据分区装载,如果不是根节点则当前节点向父节点提交释放对应分区映射缓存的请求,并回溯到当前节点的父节点作为当前节点。
9.如权利要求1-6任一所述的关联表的数据分区装载方法,其特征在于,在对所述主表进行数据分区装载之前,所述方法还包括:
分区装载程序在初始化时,根据关联关系构建关联表对应的树形数据结构,并为树形数据结构中的每个节点构建空的分区映射缓存;
其中,对于每个节点,分区装载程序对应该节点的每个子节点构建一个空的分区映射缓存,或对应该节点的每组关联子节点构建一个空的分区映射缓存。
10.一种关联表的数据分区装载装置,其特征在于,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-9任一所述的关联表的数据分区装载方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110766468.1A CN113468178B (zh) | 2021-07-07 | 2021-07-07 | 一种关联表的数据分区装载方法与装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110766468.1A CN113468178B (zh) | 2021-07-07 | 2021-07-07 | 一种关联表的数据分区装载方法与装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113468178A CN113468178A (zh) | 2021-10-01 |
CN113468178B true CN113468178B (zh) | 2022-07-29 |
Family
ID=77878810
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110766468.1A Active CN113468178B (zh) | 2021-07-07 | 2021-07-07 | 一种关联表的数据分区装载方法与装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113468178B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114780541B (zh) * | 2022-04-01 | 2024-04-12 | 港珠澳大桥管理局 | 微批流处理***中的数据分区方法、装置、设备和介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101916261A (zh) * | 2010-07-28 | 2010-12-15 | 北京播思软件技术有限公司 | 一种分布式并行数据库***的数据分区方法 |
US9733869B1 (en) * | 2015-09-25 | 2017-08-15 | Amazon Technologies, Inc. | Provisioning a slave for data storage using metadata with updated references |
CN108241620A (zh) * | 2016-12-23 | 2018-07-03 | 北京国双科技有限公司 | 查询脚本的生成方法及装置 |
KR20190124512A (ko) * | 2018-04-26 | 2019-11-05 | 충북대학교 산학협력단 | 그래프 스트림에 대한 실시간 분산 저장을 위한 분할 방법 및 분할 장치 |
CN112395286A (zh) * | 2019-08-16 | 2021-02-23 | 中移(苏州)软件技术有限公司 | 链式数据表连接方法、装置、设备及存储介质 |
-
2021
- 2021-07-07 CN CN202110766468.1A patent/CN113468178B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101916261A (zh) * | 2010-07-28 | 2010-12-15 | 北京播思软件技术有限公司 | 一种分布式并行数据库***的数据分区方法 |
US9733869B1 (en) * | 2015-09-25 | 2017-08-15 | Amazon Technologies, Inc. | Provisioning a slave for data storage using metadata with updated references |
CN108241620A (zh) * | 2016-12-23 | 2018-07-03 | 北京国双科技有限公司 | 查询脚本的生成方法及装置 |
KR20190124512A (ko) * | 2018-04-26 | 2019-11-05 | 충북대학교 산학협력단 | 그래프 스트림에 대한 실시간 분산 저장을 위한 분할 방법 및 분할 장치 |
CN112395286A (zh) * | 2019-08-16 | 2021-02-23 | 中移(苏州)软件技术有限公司 | 链式数据表连接方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN113468178A (zh) | 2021-10-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104866608B (zh) | 一种数据仓库中基于连接索引的查询优化方法 | |
CN107092656B (zh) | 一种树状结构数据处理方法及*** | |
CN106484875B (zh) | 基于molap的数据处理方法及装置 | |
US10127279B2 (en) | Eigenvalue-based data query | |
CN103309958B (zh) | Gpu和cpu混合架构下的olap星型连接查询优化方法 | |
CN103631870B (zh) | 一种用于大规模分布式数据处理的***及其方法 | |
WO2018177060A1 (zh) | 查询优化方法及相关装置 | |
CN103631911B (zh) | 基于数组存储和向量处理的olap查询处理方法 | |
US20110167056A1 (en) | Parameter-sensitive plans | |
CN107016071B (zh) | 一种利用简单路径特征优化树状结构数据的方法及*** | |
CN100594497C (zh) | 一种实现网络查询缓存的***和查询方法 | |
CN111126625B (zh) | 一种可扩展的学习索引方法及*** | |
US20100235344A1 (en) | Mechanism for utilizing partitioning pruning techniques for xml indexes | |
CN105630881A (zh) | 一种rdf的数据存储方法和查询方法 | |
CN112015741A (zh) | 一种海量数据的分库分表存储方法与装置 | |
CN113111058B (zh) | 一种数据库的处理方法和装置 | |
CN113468178B (zh) | 一种关联表的数据分区装载方法与装置 | |
CN106484815A (zh) | 一种基于海量数据类sql检索场景的自动识别优化方法 | |
CN112000845B (zh) | 一种基于gpu加速的超空间哈希索引方法 | |
CN107273443B (zh) | 一种基于大数据模型元数据的混合索引方法 | |
Scriney et al. | Efficient cube construction for smart city data | |
US9135302B2 (en) | Query rewrite with a nested materialized view | |
CN112818010B (zh) | 数据库查询方法及装置 | |
CN115114325A (zh) | 数据查询方法、装置、电子设备以及存储介质 | |
CN111382170B (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 |