技术分享|基于SQL Server Change Tracking实现宽表的增量更新


源宝导读:在企业建设信息化的过程中,客户通常会使用一些数仓工具来构建数据资产,随着用户的要求越来越高,传统的ETL技术已经无法满足客户的实时性诉求,本文将分享“天际-数据平台”如何基于SQL Server来实现数仓数据的实时更新。

一、实现思路

为了提升数据的时效性,最简单的方法是将ETL的频率设置为每分钟一次或更短,以达到数据及时更新的目的。很显然,这种方案会给服务器造成很大的压力,有些ETL的执行时长甚至超过了调度周期,并不是一个可行的方案。

但是,我们仔细想想,如果两次调度的间隔非常短,业务系统在这两次调度之间产生的业务数据也会非常少,甚至没有任何数据产生,我们是否可以根据“变化的数据”来实现增量更新呢?

其实,ETL的目的就是为了生成一张大宽表,我们可以基于宽表模型设计一个增量更新的方案:

该流程可以每分钟运行一次,将原先每分钟的“全量计算”优化为了“增量计算”,这样就大幅度的降低数据库的压力。

二、详细方案

在开始之前,先看一下明源宽表的定义:所有的宽表都是“围绕一个业务实体,将该业务实体相关的维度、指标和属性关联在一起,形成了一张数据库表”。

“房间宽表”示例如下:

这里有两个特征:

1、每个宽表必须有一个唯一的主键,这个主键来源于ERP的业务实体表。

2、其它的维度和指标可以来源于不同的业务表,但都能通过宽表的主键联系在一起。

这样的模型非常有助于我们实现增量更新:我们可以让用户将每组指标的计算逻辑拆分出来单独定义,一旦某个业务发生之后,只需要对受影响的指标进行重新计算即可。

那么,如何找到受影响的指标,以及如何找到受影响的行呢?接下来,对流程图中几个关键问题进行详细讨论。

(一)我们需要监听哪些表的数据变化?

参与宽表逻辑计算的表才是我们需要监听的表,其它表都不需要关注。

(二)如何对表的变化数据进行跟踪?

我们可以在表上创建触发器或者新增时间戳字段,用于获取增量变化的数据。但是这种方案会对ERP数据库产生侵入性,并且时间戳字段解决不了delete的场景。针对这个痛点,微软在SQL Server 2008及之后的版本中,提供了SQL Server Change Tracking和SQL Server Change Data Capture两种解决方案,直接在数据库级别记录了各个表的数据变更日志,开发人员按需获取就行。我们需要在Change Tracking(简称CT)和Change Data Capture(简称CDC)之间做一个选择,两者的对比分析如下:

CT和CDC都有类似“版本号”和“序列号”的字段用于记录数据变化的顺序,同时都有“operation”字段用于标识数据变化的类型:

两者的差异点在于:CT只返回了变化表的主键值,而CDC返回了整个数据行。从能力上讲,CDC要大于CT,但是使用CDC需要开启SQL Server Agent服务,而CT则没有任何依赖。相对来说,CT相对于CDC更加轻量级,在产品上线时也没有额外的负担,这也是我们选择CT的核心原因,我们很难确保所有客户的SQL Server Agent服务都正确安装和时刻运行。

我们对相关表开启CT后,就可以通过CHANGETABLE函数来获取增量数据了

SELECT * FROM CHANGETABLE(CHANGES @table_name, @last_synchronization_version) AS CT

@table_name代表获取哪个表的变更数据。

@last_synchronization_version指的是获取哪个版本号之后的变更数据,在每次获取到变更数据之后,我们还需要将返回值中的最大版本号记录下来,以便于以下次获取增量数据。如果是第一次查询,@last_synchronization_version则为0。

(三)如何根据“表的变化”推算出“宽表中受影响的行”?

在通过CT跟踪到每张表的变更数据之后,CT函数只返回了变更表的主键,并不是“宽表的主键”。我们需要让用户针对每个表编写一个SQL语句,用来告诉程序“该表变化后如何推算出宽表中受影响的主键”,这个步骤主要是靠用户来定义。

还是以“房间宽表”为例,当101房间发生了签约业务之后,我们就需要更新101房间的“签约信息”,由于CT中只能获取到“合同Id”,这里就需要用户编写一个SQL语句,便于程序将101房间计算出来。
针对"合同表"的转换SQL可以编写成如下:
SELECT 房间Id FROM 合同表 WHERE 合同Id=@合同Id

"@合同Id"代表CT中监听到的“合同表主键”,我们将它带入到SQL语句的参数中就得到了我们重新计算的“房间Id”。

(四)如何根据“表的变化”推算出“宽表中受影响的列”?

为了实现最小粒度的数据更新,我们需要让用户将清洗逻辑拆分成多个小段,每个小段负责一个或多个指标的逻辑计算,拆分的越小,增量的效果越明显。为了保证程序能够将所有的“小段逻辑”关联起来,每个“小段逻辑”必须输出宽表的主键。

有了上面的定义之后,我们再看“本次变化的表”出现在哪些“小段逻辑”中,这些“小段逻辑”对应的指标就是需要重新计算的列。

(五)如何重新计算受影响的数据?

将“第三步得到的结果”做为过滤条件,拼接在“第四步的小段逻辑中”,即可计算出受影响的数据,示例如下:

SELECT * FROM(
--ETL语句
SELECT 宽表主键,指标1
FROM 表1
LEFT JOIN 表2
LEFT JOIN 子查询
GROUP BY ...) t
WHERE 宽表主键 IN (@宽表中受影响的主键)

最后再将该指标的结果更新到宽表中。

三、如何实现

我们首先需要一个B/S架构的宽表管理系统,客户端用来负责宽表的元数据管理,服务端用于数据的增量清洗。

宽表的元数据包含以下几个对象:宽表的名称、字段定义、每个指标的清洗逻辑、每个表如何转换出“宽表主键”的SQL。

服务端在第一次启动宽表时,需要执行所有的“小段逻辑”,先将全量的数据生成到宽表中,然后再循环执行增量更新的流程。

详细版的增量更新逻辑如下:

四、应用总结

明源宽表不仅解决了报表取数的性能问题,同时具备很好的时效性,为“传统的ETL”技术赋予了“实时”的属性。在明源ERP出库时,已经将“宽表服务”作为了标准配套服务,目前累计服务超过了1400家客户。

----- END ------

作者简介

袁同学: SM,目前负责数据平台相关工作。

也许您还想看:

天际数见数据质量巡检架构优化

技术分享 | 构建图表组件生态化的技术实战

更多明源云·天际开放平台场景案例与开发小知识,可以关注明源云天际开发者社区公众号:

【建模】附件下载支持水印显示,降低资料文档泄露风险

【集成】如何“零”代码实现售楼在线电子签约的交付上线

DevOps平台如何快速创建应用?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 文件操作详解(一)---------File类

C#对文件的操作相当方便,主要涉及到四个类:File、FileInfo、Directory、DirectoryInfo,前两个提供了针对文件的操作,后两个提供了针对目录的操作,类图关系如下: 图1:类图 下面通过实例来看下每个…

小时“数感”好,长大才能数学好

▲数据汪特别推荐点击上图进入玩酷屋很多妈妈都无比担心孩子的数学:孩子会不会像自己一样重蹈覆辙呢?在很多人眼里,数学是一堆怎么也弄不明白的公式、符号,而且是怎么努力怎么用功死活就是学不好的一门学科。可是,同样…

java并行流 阻塞主线程_多线程入门案例与java8的并行流

java8 实例请移步https://www.cnblogs.com/ngLee/p/14021859.html进程与线程进程是所有线程的集合,每一个线程是进程中的一条执行路径。多线程的创建方式,继承Thread\实现Runable/*** 第一种创建线程的方式,继承Thread*/public class MultiTh…

BlazorCharts 原生图表库的建设历程

点击蓝字关注我们背景目前 Blazor 中可用的图表组件库主要有以下几个:ant-design-blazor/ant-design-charts-blazor-基于G2Plot mariusmuntean/ChartJs.Blazor- 基于ChartJs blazor-cn/Blazor.ECharts- 基于EChartsant-design-charts-blazor是我主导完成的&#xff…

Imageready(IR)动画介绍

PS自带了IR的大部分功能,如需使用动画功能,打开窗口---动画 ,然后就可以做动画了。最后保存方式要注意。存储为web和设备所用格式之后在弹出的选项上选GIF 。  一般通过设置图层不透明度来隐藏的图片实现多个图片切换。 CS5好像无法直接导出为swf。

别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!

全世界只有3.14 % 的人关注了数据与算法之美在知乎上看过一个问题:在当今社会,英语还重要吗?点赞第一的回答是——英语可以差,但你的口语一定要好!你记住了1万个单词、将语法书倒背如流、英语成绩名列前茅、英语证书一…

java中treemap释放_在Java中从TreeMap删除键

使用该remove()方法从TreeMap中删除键。让我们首先创建一个TreeMap并添加一些元素-TreeMap m new TreeMap();m.put(1,"India");m.put(2,"US");m.put(3,"Australia");m.put(4,"Netherlands");m.put(5,"Canada");现在让我们删…

WPF 路径动画PathAnimations的使用

在wpf中让一个控件按照一定的路径运行的动画。。叫做路径动画&#xff0c;这个示例演示了让一个rectangle按照一个s形曲线反复运行的动画。效果&#xff1a;只有一个文件&#xff1a;全部代码如下 &#xff1a;<Window x:Class"wpfcore.MainWindow"xmlns"htt…

setresult()java_Java ResultSet getType()方法与示例

该java.sql.ResultSet中的接口表示由SQL语句返回这样的表格数据。即ResultSet对象保存由执行查询数据库的语句的方法返回的表格数据(通常是Statement接口的executeQuery()方法)。ResultSet对象的类型根据您可以遍历的方向及其灵敏度确定结果集的类型。(在ResultSet中完成的更改…

STEM科学实验:测试了2000+儿童后证明它秒杀了90%的玩具!

▲数据汪特别推荐点击上图进入玩酷屋除了ipad和那些普通的玩具&#xff0c;我们还能给孩子玩儿些什么&#xff1f;当然是“玩”科学。因为创造力是他们这个年纪&#xff0c;最需要培养的东西。真正的科学启蒙不是将科学知识生硬的灌输给孩子&#xff0c;而是要让孩子在探索中能…

两个对象转换的方法

1、如果属性完全一致&#xff0c;可以使用已有方法 BeanUtils.copyProperties(clientPlugin, clientPluginVO); SuppressWarnings("all") ResourceMapping(value "/plugin/list", method HttpMethod.GET) public List<ClientPluginVO> getClient…

java如何运行一个任务_如何每天从Java运行任务?

石英是在Java环境中调度进程最著名的解决方案,但您有很多选择。检查此列表:Quartz是一个开放源码作业调度系统,可以与任何J2EE或J2SE应用程序集成,也可以与之一起使用。Quartz可用于创建简单或复杂的计划。Jcrontab设计用于扩展和集成任何项目。读取和存储要在文件、数据库或EJ…

人工智能时代,学好数学有什么用?

随着科技的快速发展&#xff0c;人工智能的热度越来越高。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共享…

JQuery真的不难~第六回 JQ中的异步调用方式

回到目录 前言 今天主要讲一下JQ中的异步编程&#xff0c;它将ajax进行封装&#xff0c;在进行异步请求时显得非常容易&#xff0c;无论是GET&#xff0c;POST方式&#xff0c;还是text,xml,javascript,json等数据通讯都是那么的自然 现在&#xff0c;我们就走入jq的ajax的殿堂…

使用CLI模板 | Visual Studio 2019(16.10)新功能试用

Visual Studio很早以前就有模板了&#xff0c;.NET Core命令行界面&#xff08;CLI&#xff09;也能够安装模板并通过dotnet new命令使用它们。然而&#xff0c;但是并没有什么简单的方法可以在Visual Studio中直接使用这些模板。在Visual Studio 2019(16.10)中&#xff0c;启用…

jmeter测试java服务_Jmeter 测试 JMS (Java Message Service)/ActiveMQ 性能

前言JMS 介绍:JMS 即 Java 消息服务(Java Message Service)应用程序接口&#xff0c;是一个 Java 平台中关于面向消息中间件(MOM)的 API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。(百度)本文只测试 ActiveMQ,其他消息中…

MetroGridHelper: A helpful debugging assistant for designers and developers alike

You’ve heard me preach it before: fix those margins, align, and try and make your apps as beautiful and inspiring as you can (see also: my designer tips for developers). On Thursday, I stopped by the Windows Phone Design Team’s beautiful studio space her…

马斯克和贝索斯的“星球大战”

全世界只有3.14 % 的人关注了数据与算法之美商业太空计划已经蓬勃发展了十年。在这个领域中&#xff0c;最雄心勃勃的两家公司当属Blue Origin&#xff08;蓝色起源&#xff09;和SpaceX&#xff08;太空探索技术公司&#xff09;&#xff0c;而它们之间的竞争一直是众人的焦点…

【招聘(北京)】北京华光普泰生物招聘.NET软件开发

.Net开发工程师——中级 3~5年 15~20K公司名称&#xff1a;北京华光普泰生物技术有限公司工作地址&#xff1a;北京市海淀区青云当代大厦岗位职责&#xff1a;1. 与技术负责人讨论确定项目架构和技术选型等关键问题并形成技术方案2. 完成软件子系统框架设计&#xff0c;包括基本…

java pojo 是什么_什么是POJO

POJO(Plain Old Java Objects)简单的Java对象&#xff0c;实际就是普通JavaBeans&#xff0c;是为了避免和EJB混淆所创造的简称。在Java应用程序中的角色使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其gettersetter方法的类,没有业务逻辑&#xf…