技术分享|基于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…

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

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

WPF 路径动画PathAnimations的使用

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

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

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

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

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

使用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;而它们之间的竞争一直是众人的焦点…

java pojo 是什么_什么是POJO

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

JMeter基础知识

2019独角兽企业重金招聘Python工程师标准>>> 1.JMeter常用术语 1&#xff09;采样器&#xff08;Samplers&#xff09; 采样器是JMeter测试脚本的基础单元&#xff0c;用户可以用他来向服务器发出一个特定的请求&#xff0c;比如HTTP请求、JAVA请求。 2&#xff…

开年趣图汇总:对不起,让你笑了这么久

全世界只有3.14 % 的人关注了数据与算法之美房东家小孩抓周&#xff0c;感觉不管抓什么都很有未来....计算机语言成就一段恋情程序员&#xff0c;千万别像他学习如果编程语言是工具你这工作怎么越做越晚呢&#xff1f;那一刻&#xff0c;程序员露出了尴尬又不失礼貌的微笑这个名…

【视频回放】Best of Build Tour in China 暨 Watching Party - 大湾区专场

活动介绍微软一年一度的Build大会已经在5月25-27日盛大召开&#xff0c;今年的主题演讲&#xff0c;全球CEO Satya Nadella从开发者速度&#xff0c;智能云原生应用&#xff0c;以及在混合工作场景下提高生产力等诸多话题进行探讨。为了让技术社区和开发者更好地了解微软Build大…

Entity Framework Core 6.0 预览4 性能改进

起因微软在Build2021开发者大会上,发布Entity Framework Core 6.0(简称EFCore 6)预览第四版,号称是性能版本,性能提升主要对于Entity Framework Core 5.性能改进:EFCore 5.0和EFCore 6.0基准测试,提升了70%.在查询时,比EFCore5.0提升了31%.内存改进了不少,减少43%.减少内存分配…

这个地球仪太惊艳了,陪孩子畅聊天文地理。

▲数据汪特别推荐点击上图进入玩酷屋一个人一旦对某事物有了浓厚的兴趣&#xff0c;就会主动去求知、去探索、去实践&#xff0c;并在求知、探索、实践中产生愉快的情绪和体验。所以&#xff0c;古今中外的教育家无不重视兴趣在智力开发中的作用。小木之前推荐过一款AR地球仪&a…

两篇很牛的vim使用技巧

2019独角兽企业重金招聘Python工程师标准>>> 读本文之前请注意&#xff1a; 1. 本文的目标是提供一些vim的使用技巧&#xff0c;利用这些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用&#xff0c;但是现在基本上都是用vim了。 2. 本文是整理和总结使用技巧…

辍学程序员改变世界,这位长得像马云的90后要击败Facebook的扎克伯格了…

全世界只有3.14 % 的人关注了数据与算法之美众所周知&#xff0c;Facebook的创始人扎克伯格&#xff08;Mark Zuckerberg&#xff09;&#xff0c;是史上最年轻的世界亿万富豪。小扎作为社交网络时代的的缔造者&#xff0c;成为了当之无愧的程序员界80后杰出代表。但数据汪今天…