我们正在从头开始构建新的近实时(每10分钟刷新一次)的医院数据仓库。数据位于oracle数据库上,我们计划使用SSIS包从Oracle提取数据并加载到SQL Server数据库中。我对DWHousing非常陌生,需要有关构建DWH的建议。
问题:
1)从Oracle提取数据时,我应该导入完整的表还是应该只获得想要的选定列? 例如:如果我有person,address,facility_hist表,是否应该将它们加入到提取包中,并且只获取选定的列?还是应该在暂存区中分别提取所有三个表,然后将它们组合并加载到SQL Server中。
2)应该在目标表上还是在提取数据时创建索引?
3)我计划通过使用create_dt_tm作为记录来分批进行初始加载,并以月为单位加载数据。加载完所有内容后,我们计划使用updt_dt_tm并加载最近10分钟内完成的所有更新。
4)连接数据库是否是每10分钟获取一次数据的好主意?
图像显示了我计划使用的DWH ETL SSIS软件包(而不是将其连接到oracle DB的平面文件)enter image description here
答案 0 :(得分:3)
这是一个非常广泛的问题,您还没有深入了解 将源医疗数据映射到业务友好的星型模式。
数据仓库要求和十分钟要求从何而来?对于企业而言,更重要的驱动因素是:只有十分钟的等待时间,还是具有一致的正确信息?我想重点放在运营(入职等)上,而不是财务或人力资源上?
从Oracle提取数据时,我应该导入完整的 表格还是只应获取所需的选定列?例如 :如果我有人员,地址,设施历史表,我应该加入他们吗 提取包并仅获取选定的列?还是我应该 在暂存区域中分别提取所有三个表,然后合并 将它们加载到SQL Server中。
在“ ODS层”方法中,SQL数据库中存在Oracle表的完整副本(通常在不同的SQL Server架构中。请注意,Oracle和SQL Server中的“模式”意味着完全不同的事物)
ODS基本上是源系统的副本。如果要刷新10分钟,则需要将增量(仅更改)加载到ODS中。为此,您需要知道自上次加载ODS以来源中发生了什么变化。如果源中有一个“最后更改”字段,这很容易。否则会变得非常困难。
当数据按层批处理时,ODS方法与“批处理加载”模式保持一致。 ODS允许您在不同的层进行测试和故障排除。
ODS方法不同于“流”方法,后者支持实时报告,但在流中始终包含隔离的转换规则。
应该在目标表上还是在提取数据时创建索引?
通常应在加载数据之前禁用索引/将其放在表上,然后再重建索引
我计划通过使用 create_dt_tm用于记录,并以月为单位加载数据。一旦 一切都已加载,我们计划使用updt_dt_tm并加载 最近10分钟内完成的所有更新。
我不知道updt_dt_tm
是什么,但这听起来是个好主意
连接数据库是否是每10分钟获取一次数据的好主意?
是的。您还将如何获取数据?
总而言之,基于增量负载,着重于使十分钟的ODS复制副本正常工作。然后,下一步是将数据从ODS转换为星型模式。
我们如何使用SSIS包从Oracle中提取数据并将其加载到SQL Server DWH中。
同样,这是一个非常广泛的问题,我可以在这里为您键入一个完整的方法,但我认为我的付费客户不会喜欢它
有许多设计模式。我更喜欢ELT(提取负载转换)ODS方法,这是T-SQL的沉重负担,但以我的经验是最好的方法。通过这种方法,您可以加载和暂存最近几天更新的记录,然后使用SQL将它们合并到ODS表中
仅一件事:我在您的问题历史记录中看到您正在询问条件拆分。我只需要警告您,如果您开始在SSIS中使用条件拆分和查找来加载数据,则您的程序包可能无法很好地执行,并且最终将导致非常复杂的事情,并且吹完你的十分钟。
这实际上归结为ETL vs ETL方法。如果您对SQL不满意,则可能必须使用ELT(SSIS软件包中的所有登录名)方法。但是根据我的经验,它变得缓慢且难以维护
答案 1 :(得分:1)
我最近构建了一个具有类似要求的解决方案,但是我的解决方案将100多个表从Oracle EBS DB复制到“ Live BI”系统,而延迟只有几秒钟。但是,我选择Vertica作为用于数据集成的DB和StreamSet。
StreamsSets专为流传输而设计,并具有单个数据管道,它可以处理我的所有表。它找出所有列,甚至是用于在目标DB上进行更新的键。
我之所以使用Vertica,是因为柱状MPP数据库可以提供按行DB的100倍的性能,并且不使用需要重建的索引。 Vertica比诸如RedShift,Snowflake和BigQuery的最近的仅云列数据库更成熟,并且设计了内存中的写优化存储和磁盘上的读优化存储,因此写入速度非常快。在幕后,元组移动器进程每五分钟压缩一次写入的数据,但是查询总是通过合并这两个区域来返回最新数据。
我们将表设计批准为ODS /数据湖,但我确实选择排除100%为空的列(StreamSets只是跳过了不在目标中的列)。我确实有一些表会定期刷新,例如我的日历表和度量单位转换,因为视图可能会影响性能并且它们不会经常更改。否则,我将不理会这些表,而使用视图和Oracle BI语义层数据建模来构建业务的用户友好视图。因为数据库是列式的,所以即使表经常有超过100列,我的查询也非常快。