ETL --事实表
每一个事实表通过表的粒度来定义。事实表的粒度是事件度量的定义。我们必须至始至终按照度量如何在 现实世界中理解来规定事实表的粒度。
所有的事实表包含了一组关联到维表的外键,而这些维表提供了事实表度量的上下文。大多数的事实表还 包括了一个或者多个数值型的度量字段,我们称之为事实。
每个事实表应该拥有一个主键,即使仅仅是出于管理的需要也应该在事实表设立主键。如果没有主键完整 性,那么事实表中有可能存在两个或者更多一样的记录,如何区分就不得而知了。
事实表的更新在维表之后。
按粒度将事实表分为三种类型:
1 交易粒度事实表
交易粒度表示的是在特定时间、空间点上的一次瞬间的测量。典型的例子是零售交易。交易粒度记录只 有度量事件发生的时候才被记录。这样,交易粒度事实表既可以为空的也可包含成百亿的记录。
2 周期快照事实表
周期快照事实表表现的是一个时间段,或者规律性的重复。这类表非常适合跟踪长期的过程,例如银行 账户和其他形式的财务报表。最常用的财务上的周期快照事实表通常有一个月粒度。在周期快照事实表中 的数据必须符合该粒度(就是说,他们必须量测的是同一个时间段中的活动)。
在周期快照事实表中的日期维度是周期。所以,对于月度周期快照的日期维度是月,周等一段时间的聚 合的维度。
3 聚合快照事实表
聚合快照事实表用于描述那些有明确开始和结束的过程,例如合同履行,保单受理以及常见的工作流。 聚合快照不适合长期连续的处理,如跟踪银行账户或者描述连续的生产制造过程,如造纸。
聚合快照事实表有几个特殊的属性。最明显的是量的日历日期外键。所有的聚合快照事实表都拥有一组 日期,按照表的标准模式来创建。如图:
- 订单日期
- 请求发货日期
- 实际发货日期
- 交付日期
- 上次付款日期
- 退货日期
- 结算日期

确保参照完整性
确保事实表的参照完整性,无非就考虑两种情况:
1 加载包含了错误外键的事实表记录;
2 删除了维表记录,而其主键在事实表中被使用。
对于不能保证参照完整性的时候,我们需要在设计的时候参照下图的流程进行:

其中:
1 在将事实数据加载到最终表之前,仔细的审核和准备数据,在删除任何维表记录之前,仔细地审核
从项目角度来讲,这种方法可行,在数据加载到事实表中最后一步就是查找事实表记录中的自然外键, 然后将他们替换成为维表中的代理键。这个过程的核心是一个特殊的查找表,它包含了每一个外来的自然键所使用的代理键的值。如果这张表被正确的维护,那么事实表中的记录将满足参照完整性。同样在维表 记录被删除的时候也需要尝试联结事实表和维表,只有在查询返回 null 的时候才能够删除该记录。
2 在每次事实表插入操作和每次维表删除操作动作发生时,使用数据库自己的参照完整性检查 简单,但是对于非常大的数据量的时候,肯定会影响性能。
3 加载后对事实表进行扫描检查,以发现和更正有问题的外键,解决参照完整性冲突。 这个方法开销超级大。可以作为第一个方法的补充。
Load 事实表的建议:
索引
我们知道索引在数据查找的时候能够提供很好的速度的提升,但是在数据加载的时候起到的却是相反作用。如果不能很好的处理,那些使用了大量索引的表将导致你的处理变得非常缓慢。在开始加载数据以前, 在前置任务中需要删除所有的索引,然后在后置任务中重建所有的索引。如果在加载过程中包含数据更新 (Update)操作,需要将那些要执行更新的记录和其他仅仅需要简单插入的记录分开,单独处理。简单的说,
请按照下列的步骤来避免索引导致的 ETL 处理瓶颈:
1. 从要插入的记录中分离那些需要执行更新操作的记录
2. 删除那些更新操作不需要的索引
3. 加载那些需要更新的记录
4. 删除剩余的索引
5. 通过批量加载方式执行数据插入
6. 重建所有的索引。
分区
表分区,可以按照时间进行分区,当分区不够的时候我们需要动态的新增分区。这种分区的优点是显而 易见的,当我们需要查找 10 年中某一个月的数据的时候,我们只需要查找这个月所在的分区,而不需要 全表查找。
回滚日志
我们知道回滚日志在一般的数据库中都是有这个功能的,他有他的好处,当进行误操作或其他的问题的 时候我们直接可以 redo。但是这个功能是否需要用在数据仓库中体现吗?答案是不需要!
原因: 1 所有的数据通过受 ETL 系统管理的进程输入;
2 数据批量的加载;
3 如果加载过程失败,数据可以很容易的重新加载。
对于 SQL INSERT 也是一样的,使用 SQL INSERT 语句会导致产生一些数据库日志,这些日志的目 的是错误恢复,但是对于数据仓库环境他们完全是多余的。如果加载程序失败了,ETL 工具能够从错误中 恢复,并从错误点开始处理剩下的部分,而不需要使用数据库的日志。
装载(Load)
1 单独处理数据插入。
很多 ETL 工具(以及一些数据库)提供 update else insert 功能(如下图)。 这个功能非常方便,且有着非常简单的数据流程逻辑,但是性能非常的低。ETL 过程对已经存在的数据的 更新逻辑中包括区分那些已经存储在事实表中记录和新数据。当处理大量的数据的任何时候,你想到的是 数据批量加载到数据仓库。但是不幸的是,很多批量导入工具不支持更改已经存在的记录。通过分离需要 更新的记录,你可以先处理更新,然后再执行批量的导入,这样获得最佳的加载性能。
2 利用批量加载工具。
使用批量加载工具,而非使用 SQL 语句加载大量数据可以降低数据库负载, 并极大的提高加载效率。
3 并行的加载。
在加载大量数据的时候,将数据物理上分成不同的逻辑段。如果加载 5 年的数据,你 可以做 5 个数据文件,每个文件中包含一年的数据。一些 ETL 工具允许你根据数据范围进行数据分区。 一旦数据被分成均等的部分,运行 ETL 过程并行的加载所有的分段。
4 最小化物理更新。
在表中更新记录操作需要耗用 DBMS 很多资源,最大的原因是数据库要生成回 滚日志。要最小化对回滚日志的操作,可以采用批量的加载数据。如何处理那些需要更新的数据呢?很多 情况下,最佳的方式是删除要更新的记录,然后批量的加载所有的数据。由于要做更新的数据和总的数据 量的比率会极大的影响优化方式的选择,因此需要一些反复测试来判断针对具体情况的最终加载策略。
5 在数据库外进行聚合。
在数据库之外进行排序,合并和聚合要比在 DBMS 内使用 SQL 语句,使用 COUNT 和 SUM 函数,GROUP BY 和 ORGER BY 关键字高效的多。ETL 过程需要将巨大数量的数 据进行排序、合并放在进入关系型数据库准备区之前完成。很多 ETL 工具提供这些功能,但是专门的工 具在操作系统级别执行排序/合并意味着为处理大数据集进行额外的投资。
更新和纠正事实记录
1 消除事实
这种方法是创建一个完整的错误的资料库,当发生某种错误的时候查找此资料库,从中找出该种错误事 实的纠正信息。
2 删除事实
有两种方法:
1 从物理直接删除,比较不推荐,当然了能够确保事实的参考完整性约束的话,删除最为简单;
2 在事实表中添加一个 flag 字段,初始化此字段,值为:TRUE,FALSE,TRUE 为不删除,FALSE 为删除。
无事实的事实表
每个事实表的粒度是一个事件量测。在某些情况下,事件可以发生,但是没有具体的测量值。例如一个 事实表用来记录交通事故事件。每个事件的发生是无可质疑的,维度设计是强制性且非常直接的。
聚合:
提高大型数据仓库性能最重要的手段是在基础记录上建立一组适当的聚合记录。聚合可以显著的提高性 能,一些情况下,查询的性能可以提高 100 倍,甚至 1000 倍。没有其他的方法可以获得如此的性能提 升。在 BIEE 中可以看到,当我们在逻辑层中给某个字段的聚合方式加入 count 之后,在展现的时候变能 够通过 count 的字段的其他字段进行分组计数了
相关文章:
ETL --事实表
每一个事实表通过表的粒度来定义。事实表的粒度是事件度量的定义。我们必须至始至终按照度量如何在 现实世界中理解来规定事实表的粒度。 所有的事实表包含了一组关联到维表的外键,而这些维表提供了事实表度量的上下文。大多数的事实表还 包括了一个或者多个数值型…...
手工数据采集耗时耗力?Smartbi数据填报实现数据收集分析自动化
企业在日常经营管理过程中,往往需要收集很多内外部的信息,清洗整理后再进行存储、分析、呈现、决策支持等各种作业,如何高效收集结构化数据是企业管理者经常要面对的问题。传统手工的数据采集方式不仅耗费了大量人力时间成本,还容…...
应用实战|微信小程序开发示例--多人聊天互动空间
“超能力”数据库~拿来即用,应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库(表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维),很大地降低开发者的使用门槛。 本示例是…...
css:使用filter和backdrop-filter实现高斯模糊效果
背景 今天接到一个需求是,使用高斯模糊的效果对一个页面进行模糊处理,正好借这个机会来整理一下 css3 中高斯模糊的两个 API API介绍 filter 说明: 该 API 是一个过滤器,不仅能实现高斯模糊,还有很多比如颜色偏移、…...
科技大势怎么看 2023怎么干?
2023年,科技的走向依旧是世界各国的关注重点,各国在纷纷设立自己的科技战略目标外,还在潜心研究不同技术领域的科技趋势,试图通过科技占据国际竞争的制高点。 随着我国深入实施创新驱动发展战略,推动产业结构优化升级&…...
盘点曾经很火但消失了的8个软件
目录 1、飞信 3、暴风影音 4、千千静听 5、虾米音乐 6、快车下载 7、人人网 8、QQ农场 今天小编给大家分享曾经很火但消失了的8个软件,你都用过吗? 1、飞信 飞信是中国移动通信集团公司推出的一款短信、语音、视频通信应用程序。它于2007年推出&a…...
安卓 Frament + ViewPager使用示例
1. 组成架构 整个架构被包在一个外部Fragment之中,也可以放在一个Activity之中,随意。外部的fragment包含了两个组件,即途中的ViewPager和TabLayoutViewPager要套上一个FragmentStatePagerAdapter ,适配器负责new出一个个fragment…...
【银行测试】必看的四类题型:这可是最经典的一套题目了
目录:导读 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 四、测试案例设计题 金三银四面试面对大厂面试官提问,如何回答:花3天背完这100道软件测试面试题!银行测试的offer还不是手…...
跨源资源共享(CORS)-亲测理解,以及对http的状态,参数的理解和使用,对预检请求的触发和解决
跨源资源共享(CORS)-亲测理解,以及对http的状态,参数的理解和使用 跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的…...
学生使用的台灯该怎么选择?2023适合学生房间的灯推荐
随着社会的进步发展,我们的生活水平越来越高,很多家庭的孩子都开始使用台灯这种家居产品,对于学习任务繁重的他们来说,台灯确实可以起到保护眼睛、提高学习专注度的作用。那么不知道朋友们是否了解过,台灯该怎么选择呢…...
23种设计模式-桥接模式(安卓应用场景介绍)
概念 桥接模式是一种结构型设计模式,它通过将抽象与其实现分离来解耦。它使用接口(抽象类)作为桥梁,将一个抽象类与其实现类的代码分别独立开来,从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”…...
2021牛客OI赛前集训营-提高组(第四场) T3快速访问
2021牛客OI赛前集训营-提高组(第四场) 题目大意 有一棵n1n1n1个节点的树,根节点为0。给你一个kkk,定义集合Si{j∈Z∣max(1,i−k)≤j<i}∪{0}S_i\{j\in Z|\max(1,i-k)\leq j<i\}\cup\{0\}Si{j∈Z∣max(1,i−k)≤j<i…...
【大数据是什么】
大数据是什么大数据是做什么的?大数据主要有哪些职位 ?大数据运维工程师数据仓库开发工程师ETL工程师大数据开发工程师BI工程师算法工程师大数据平台开发工程师大数据架构师讲述一下自己的大数据学习之路大数据是做什么的? 2014年,…...
大数据 | centos7图形界面无法执行yum命令
大家好,今天是三八女神节了! 你知道吗?世界上第一位电脑程序设计师是名女性,Ada Lovelace (1815-1852)。 她是一位英国数学家兼作家,第一位主张计算机不只可以用来算数的人,也发表了第一段分析机用的演算…...
三维人脸实践:基于Face3D的渲染、生成与重构 <一>
face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 该方法广泛用于基于三维人脸关键点的人脸生成、属性检测(如位姿、深度、PNCC等),能够快速实现人脸建模与渲染。推荐…...
Javascript 设计模式
设计模式的五大设计原则(SOLID)单一职责:一个程序只需要做好一件事。如果功能过于复杂就拆分开,保证每个部分的独立开放封闭原则:对扩展开放,对修改封闭。增加需求时,扩展新代码,而不是修改源代码。这是软件设计的终极…...
JAVA-文档工具screw-gui
前言 为什么萌生了写文档工具得想法,因为在项目开发得过程中,经常需要补充一些文档,比如数据库文档、详细设计文档等等,文档与项目相绑定,在项目需求新增或变更时,文档也需要反反复复得修改。 1. 数据库…...
开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一)
开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一) 前言——系列介绍 本系列文章主要是记录笔者在鸿蒙南向的学习与工作中的知识点笔记记录,其中不止会针对鸿蒙中的学习问题进行思考与记录,也会对涉及到的一些嵌入式等其他领域知识&…...
Spring - Spring框架概述面试题总结
文章目录01. 什么是Spring?02. Spring框架的设计目标,设计理念,和核心是什么?03. Spring的优点是什么?04. Spring框架中都用到了哪些设计模式?05. Spring有哪些应用场景?06. Spring由哪些模块组成…...
学习python好就业么
Python的普及与数据挖掘、人工智能和数值计算等领域的蓬勃发展相关,但同时也与普遍编程需求的增加有关。 Python作为人工智能的头号语言,一方面会吸引大量计划从事人工智能的人来学习,另一方面自然也带动了网络上对这门“新语言”的关注和讨…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
