发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于日志解析的插入操作同步优化方法和数据同步系统,其目的在于,通过减少 INSERT语句中,需要填充列的个数来提高执行性能,那些被剔除的列在插入时,数据库会默认填入NULL值,不需要在SQL语句中显示的指定,可以提高同步的性能。
为实现上述目的,按照本发明的一个方面,提供了一种基于日志解析的插入操作同步优化方法,所述插入操作同步优化方法包括:
判断待同步事务是否是针对待执行表的插入操作;
若是,则根据所述待执行表的字典信息,判断所述待执行表是否存在列定义不带默认值或者列定义的默认值为空值的目标列;
若存在,则分析所述待同步事务的各个插入操作,获取插入值为空值的目标列在各个插入操作的分布情况;
当插入值为空值的目标列的分布情况满足设定条件时,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步。
优选地,判断所述待执行表是否存在列定义不带默认值或者列定义的默认值为空值的目标列之后还包括:
若存在,则计算所述待同步事务的第一个插入操作中,插入值为空值的目标列的占比率;
判断所述占比率是否大于设定值;
若所述占比率大于设定值,则执行分析所述待同步事务的各个插入操作,获取插入值为空值的目标列在各个插入操作的分布情况的步骤。
优选地,所述分析所述待同步事务中的各个插入操作,插入值为空值的目标列在各行的分布情况包括:
步骤A:分析所述待同步事务中的第一个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第一分布标记组;
步骤B:分析所述待同步事务的第N个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第N分布标记组,其中,N表示插入操作在所述待同步事务中的排列序号,N的初始值为2;
步骤C:判断所述第一分布标记组和所述第N分布标记组是否一致;
步骤D:若一致,则设置N=N+1后,依次执行步骤B和步骤C,以得到插入值为空值的目标列在各个插入操作的分布情况。
优选地,所述插入操作同步优化方法包括:
当步骤D执行完成后,所述待同步事务结束,则插入值为空值的目标列在各个插入操作的分布完全一致;
当步骤D执行完成后,所述待同步事务中存在未被分析的插入操作,则插入值为空值的目标列在各个插入操作中的分布不完全一致。
优选地,所述插入操作同步优化方法包括:
当插入值为空值的目标列在各个插入操作的分布完全一致时,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步;
当插入值为空值的目标列在各个插入操作的分布不完全一致时,根据所述待同步事务中原有的插入操作进行数据同步。
优选地,所述插入操作同步优化方法包括:
当步骤D执行完成后,获取已经完成分布标记组分析的插入操作的数目,标记为M1;
获取所述待同步事务中所包含的插入操作的总数目,标记为M2;
判断M2与M1的差值是否小于预设的阈值;
若小于,则按照如下方式进行数据同步:
针对前M1个插入操作,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步;
针对其余的插入操作,根据原有的插入操作进行数据同步。
优选地,在步骤C:判断所述第一分布标记组和所述第N分布标记组是否一致,之后还包括:
若不一致,则根据所述待同步事务中原有的插入操作进行数据同步;
或,
步骤E:若不一致,则提取所述第一分布标记组和所述第N分布标记组中,空值分布相同的目标列,以重新生成参照分布标记组;
步骤F:设置N=N+1后,分析所述待同步事务的第N个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第N分布标记组;
步骤G:判断所述第N分布标记组与所述参照分布标记组是否一致;
步骤H:若一致,则依次执行步骤F和步骤G,以得到插入值为空值的目标列在各个插入操作的分布情况。
优选地,所述插入操作同步优化方法还包括:
当步骤H执行完成时,获取已经完成分布标记组分析的插入操作的排列序号,标记为P,获取所述参照分布标记组中的目标列,标记为优化目标列;
按照如下方式进行数据同步:
针对前P个插入操作,在原有插入操作的基础上,将与所述优化目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步;
针对其余的插入操作,根据原有的插入操作进行数据同步。
优选地,所述判断待同步事务是否是针对待执行表的插入操作之后还包括:
若不是,则根据所述待同步事务原有的DML操作进行数据同步。
为实现上述目的,按照本发明的另一个方面,提供了一种数据同步系统,所述数据同步系统包括至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行本申请所述的插入操作同步优化方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:对于较大规模的插入操作,在插入操作满足优化条件时,通过减少INSERT语句中,需要填充列的个数来提高执行性能,那些被剔除的列在插入时,数据库会默认填入NULL值,不需要在SQL语句中显示的指定,可以提高同步的性能。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
在实际应用场景下,在源端部署源端数据同步系统,在目标端部署目标端数据同步系统,所述源端数据同步系统用于将源端数据库的日志发送至所述目标端数据同步系统,所述目标端数据同步系统用于解析所述源端数据库的日志,以将源端数据库的同步操作应用到所述目标端数据库。
如图1所示,在本实施例中,提供一种基于日志解析的插入操作同步优化方法,所述插入操作同步优化方法具体包括:
步骤101:判断待同步事务是否是针对待执行表的插入操作。
源端数据库在执行各个操作时,会产生日志记录相应的操作,日志中会记录操作所属事务的事务标识号(事务ID)以及该操作在其所属的事务中的操作编号。目标端数据同步服务在接收到源端的操作以后,根据操作中携带的事务标识号,将各个操作归类到相应的事务中。
在进行数据同步时,判断待同步事务是否是针对单个表的插入操作,若是,则所述待同步事务具有可以优化的可能性,则继续执行步骤102。
步骤102:若是,则根据所述待执行表的字典信息,判断所述待执行表是否存在列定义不带默认值或者列定义的默认值为空值的目标列。
在实际应用场景下,需要先从目标端数据库中获取待执行表的字典信息,以确定所述待执行表是否存在列定义不带默认值或者列定义的默认值为空值(NULL)的目标列。如果列不带默认值或列的默认值为NULL,则表示该列在INSERT操作插入NULL时可以被优化。
在此需要说明的是,也可以先执行步骤102,再执行步骤101,在本发明中不限定具体的顺序。
在实际应用场景下,若待同步事务不是针对待执行表的插入操作,则根据所述待同步事务原有的DML操作进行数据同步。
步骤103:若存在,则分析所述待同步事务的各个插入操作,获取插入值为空值的目标列在各个插入操作的分布情况。
在实际应用场景下,一些目标列的插入值不为空值,此种形式的目标列不能被优化;对于插入值为空值的目标列也不能被优化。能够满足优化至少具备如下两个条件:列定义不带默认值或者默认值为空值,列的插入值为空值。
假设各行中,插入值为空值的目标列分布不尽相同,在分析插入操作和优化插入操作时,同样会耗费大量的CPU资源,无需进行插入操作的优化,按照原有的插入操作进行同步即可。在插入值为空值的目标列存在一定分布规律时,可以统一优化插入操作,减少插入操作语句中,需要填充列的个数来提高执行性能。
步骤103的具体实现过程详见下述描述。
步骤104:当插入值为空值的目标列的分布情况满足设定条件时,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步。
在实际应用场景下,当待执行表的目标列插入空值时,可以被优化,针对待同步事务,可以根据各行中插入值为空值的目标列的分布情况,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步。
为了便于理解本方案,以待执行表为某个省高考成绩表为例进行解释说明,该高考成绩表设置有姓名列、学号列以及N个空列,待同步事务为在该高考成绩表中插入100万行,每行中各列均插入空值。首先,待同步事务是对单个待执行表的插入操作,满足优化条件,然后,N个空列的列定义为空值,满足优化条件,将N个空列均标记为目标列。在各行中N个空列的插入值均为空值,则可以将目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步,在很大程度上减少了插入语句,可以提高数据同步的效率。
在本实施例中,通过减少INSERT语句中,需要填充列的个数来提高执行性能,那些被剔除的列在插入时,数据库会默认填入NULL值,不需要在SQL语句中显示的指定,可以提高同步的性能。
在实际应用场景下,如果对所有事务都通过详细分析每个INSERT操作来判断是否能优化,这将会消耗大量的CPU,反而会降低同步性能,在优选的实施例中,采用预判断的方式过滤出符合优化的同步场景,做到有针对性的优化。
在优选的实施例中,在步骤102之后,步骤103之前,还包括如下步骤:若所述待执行表存在列定义不带默认值或者列定义的默认值为空值的目标列,则计算所述待同步事务的第一个插入操作中,插入值为空值的目标列的占比率。
然后,判断所述占比率是否大于设定值,其中,所述设定值可以依据实际情况而定,在此不做具体限定,例如,设定值为50%或60%。
若所述占比率大于设定值,则执行分析所述待同步事务的各个插入操作,获取插入值为空值的目标列在各个插入操作的分布情况的步骤。
在可选的实施例中,待同步事务中的每个插入操作均对应有操作编号,通过该操作编号可以确定每个操作的操作顺序。先从第一个插入操作开始分析,得到相应的第一分布标记组,以第一分布标记组为参照对象,按照插入操作的操作顺序,依次得到相应的分布标记组,在下一个插入操作的分布标记组与所述第一分布标记组一致时,继续分析下一个插入操作,直至事务结束,或者,直至下一个插入操作的分布标记组与所述第一分布标记组不一致,从而得到插入值为空值的目标列在各个插入操作的分布情况。
结合图2,在步骤103中,具体包括如下步骤:
步骤A:分析所述待同步事务中的第一个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第一分布标记组。
步骤B:分析所述待同步事务的第N个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第N分布标记组,其中,N表示插入操作在所述待同步事务中的排列序号,N的初始值为2。
分析所述待同步事务的第二个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第二分布标记组。
步骤C:判断所述第一分布标记组和所述第N分布标记组是否一致。
在本实施例中,判断所述第一分布标记组和所述第二分布标记组是否一致,若一致,则执行步骤D;若不一致,则根据所述待同步事务中原有的插入操作进行数据同步。
步骤D:若一致,则设置N=N+1后,依次执行步骤B和步骤C,以得到插入值为空值的目标列在各个插入操作的分布情况。
当步骤D执行完成后,所述待同步事务结束,则插入值为空值的目标列在各个插入操作的分布完全一致,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步(本发明的优化方式)。
当步骤D执行完成后,所述待同步事务中存在未被分析的插入操作,则插入值为空值的目标列在各个插入操作中的分布不完全一致,根据所述待同步事务中原有的插入操作进行数据同步(正常模式)。
具体地,判断所述待同步事务中是否存在未被分析的插入操作,若存在,根据所述待同步事务中原有的插入操作进行数据同步(正常模式);若不存在,则在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步(本发明的优化方式)。
可以理解为,在本实施例中,从第一个插入操作开始,判断第二个插入操作的分布标记组与第一分布标记组是否一致,则继续取出下一个插入操作,判断下一个插入操作的分布标记组与第一分布标记组是否一致,如此循环,若存在不一致的情况,则按照正常模式执行;直至事务结束,分布标记组均一致,则按照本发明的优化方式进行数据同步。
实施例2:
在本实施例中,以一具体实例简要说明前述方法的执行过程。源数据库和目标端数据库现都有表T(ID INT,C1INT,C2INT DEFAULT 2,..., C1000INT)
源端应用对表T进行数据初始化,分批插入100万行数据,ID列每行的取值为1到10000000,其它列全部插入NULL值。
同步过程如下:
(1)源端数据同步服务捕获到该操作日志发往目标端数据同步服务;
(2)目标端数据同步服务在收到该事务提交日志后开始执行该事务;
(3)先从目标端数据库中获取表T的列定义,发现C2列存在默认值,并且它的默认值是2,不是NULL,那么该列如果要插入NULL值则需要在 SQL语句中显示的指定;
(4)按照前面实施例1的方法进行判断,发现该事务满足优化执行的条件;
(5)按照优化规则构造出插入语句,发现C2列的插入值虽然为NULL,但是却不满足剔除条件,得到插入语句如下:INSERT INTO T(ID,C2) VALUES(:1,:2);
(6)从该事务第一个操作开始,依次根据插入语句中绑定的列,填充列值后分批执行
(7)重复第(6)步,直到碰到该事务的提交操作,完成同步。
如果上述事务,不采用该优化方案,那么它在执行时则会生成含有1001 个列的INSERT语句:INSERT INTO T(ID,C1,C2,...,C1000) VALUES(:0,:1,:2,...,:1000),该语句在绑定和填充时将会消耗大量的CPU,并且数据库在执行时也会比优化的方案消耗更多的资源,执行效率低下。
按照实施例1的方式进行优化后,通过减少INSERT语句中,需要填充列的个数来提高执行性能,那些被剔除的列在插入时,数据库会默认填入NULL值,不需要在SQL语句中显示的指定,可以提高同步的性能。
实施例3:
存在一应用场景,待同步事务在进行表的插入操作时,大多数行所对应的分布标记组相同,小部分行所对应的分布标记组不同,例如,要插100 万行数据,98万行数据都满足优化条件,第980001行与第1行的分布标记组不同,此种情况下,仍旧可以对插入操作进行优化。
参阅图3,实施例1中的步骤103具体包括如下过程:
步骤A:分析所述待同步事务中的第一个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第一分布标记组。
其中,待同步事务中的每个插入操作均对应有操作编号,通过该操作编号可以确定每个操作的操作顺序。
步骤B:分析所述待同步事务的第N个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第N分布标记组,其中,N表示插入操作在所述待同步事务中的排列序号,N的初始值为2。
分析所述待同步事务的第二个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第二分布标记组。
步骤C:判断所述第一分布标记组和所述第N分布标记组是否一致。
判断所述第一分布标记组和所述第二分布标记组是否一致,若一致,则执行步骤D。
步骤D:若一致,则设置N=N+1后,依次执行步骤B和步骤C,以得到插入值为空值的目标列在各个插入操作的分布情况。
当步骤D执行完成后,获取已经完成分布标记组分析的插入操作的数目,标记为M1;获取所述待同步事务中所包含的插入操作的总数目,标记为M2。
然后,判断M2与M1的差值是否小于预设的阈值,其中,预设的阈值可以根据实际情况而定;若小于,则按照如下方式进行数据同步:
针对前M1个插入操作,在原有插入操作的基础上,将与插入值为空值的目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步;针对其余的插入操作,根据原有的插入操作进行数据同步。
在本实施例中,复用了实施例1的优化方案和正常模式,可以针对特定的应用场景进行插入操作的优化,拓宽了应用场景。
实施例4:
存在一应用场景,待同步事务在进行表的插入操作时,针对目标列,大多数行所对应的分布标记组相同,小部分行的某些目标列所对应的分布标记组不同,例如,要插100行数据,目标列为A列、B列、C列和D列,在第一行中,A列、B列、C列和D列插入值均为空值,其余99行的D列插入值不为空值,此种情况下,仍旧可以对插入操作进行优化,结合图4,具体实现过程如下。
步骤A:分析所述待同步事务中的第一个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第一分布标记组。
其中,待同步事务中的每个插入操作均对应有操作编号,通过该操作编号可以确定每个操作的操作顺序。
步骤B:分析所述待同步事务的第N个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第N分布标记组,其中,N表示插入操作在所述待同步事务中的排列序号,N的初始值为2。
分析所述待同步事务的第二个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第二分布标记组。
步骤C:判断所述第一分布标记组和所述第N分布标记组是否一致。
步骤E:若不一致,则提取所述第一分布标记组和所述第N分布标记组中,空值分布相同的目标列,以重新生成参照分布标记组;
步骤F:设置N=N+1后,分析所述待同步事务的第N个插入操作,绘制插入值为空值的目标列在整行的分布情况,得到第N分布标记组;
步骤G:判断所述第N分布标记组与所述参照分布标记组是否一致;
步骤H:若一致,则依次执行步骤F和步骤G,以得到插入值为空值的目标列在各个插入操作的分布情况。
在实际应用场景下,所述插入操作同步优化方法还包括:
当步骤H执行完成时,获取已经完成分布标记组分析的插入操作的排列序号,标记为P,获取所述参照分布标记组中的目标列,标记为优化目标列。
按照如下方式进行数据同步:
针对前P个插入操作,在原有插入操作的基础上,将与所述优化目标列相关的语句删除,重新生成目标插入操作,根据所述目标插入操作进行数据同步;针对其余的插入操作,根据原有的插入操作进行数据同步。
在本实施例中,复用了实施例1的优化方案和正常模式,可以针对特定的应用场景进行插入操作的优化,拓宽了应用场景。
实施例5:
请参阅图5,图5是本发明实施例提供的一种数据同步系统的结构示意图。本实施例的数据同步系统包括一个或多个处理器61以及存储器62。其中,图5中以一个处理器61为例。
处理器61和存储器62可以通过总线或者其他方式连接,图5中以通过总线连接为例。
存储器62作为非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的基于日志解析的插入操作同步优化方法以及对应的程序指令。处理器61通过运行存储在存储器62中的非易失性软件程序、指令以及模块,从而执行基于日志解析的插入操作同步优化方法的各种功能应用以及数据处理,实现前述实施例的基于日志解析的插入操作同步优化方法的功能。
其中,存储器62可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器62可选包括相对于处理器61远程设置的存储器,这些远程存储器可以通过网络连接至处理器61。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
关于基于日志解析的插入操作同步优化方法请参照前述实施例中相关的文字描述在此,不再赘述。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为ROM)、随机存取存储器(RandomAccessMemory,简写为RAM)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。