Sql server 在数据仓库中加载数据的最佳方法
我们正在从头开始构建一个新的近实时(每10分钟刷新一次)医院数据仓库。数据位于oracle数据库中,我们计划使用SSIS包从oracle提取数据并加载到SQL Server数据库中。我对DWH住房非常陌生,需要关于建造DWH的建议 问题:Sql server 在数据仓库中加载数据的最佳方法,sql-server,ssis,etl,data-warehouse,Sql Server,Ssis,Etl,Data Warehouse,我们正在从头开始构建一个新的近实时(每10分钟刷新一次)医院数据仓库。数据位于oracle数据库中,我们计划使用SSIS包从oracle提取数据并加载到SQL Server数据库中。我对DWH住房非常陌生,需要关于建造DWH的建议 问题: 从Oracle提取数据时,我应该导入完整的表还是只获取所需的选定列? 例如:如果我有person、address、facility\u hist表,我应该将它们加入提取包中,只获取所选列吗?或者我应该在暂存区域中分别提取所有三个表,然后将它们合并并加载到SQL
这是一个非常广泛的问题,您还没有深入到问题的深层复杂性中 将源医疗数据映射到业务友好的星形模式 数据仓库要求和十分钟要求从何而来?对于业务来说,什么是更重要的驱动因素:延迟只有十分钟,还是拥有一致的正确信息?我猜重点是运营(准入等),而不是财务或人力资源 从Oracle提取数据时,是否应导入完整的 表还是只获取所需的选定列?例如 :如果我有person、address、facility\u hist表,我应该加入它们吗 提取包并仅获取所选列?还是我应该 在暂存区域中分别提取所有三个表,然后合并 并将它们加载到SQL Server中 在“ODS层”方法中,您的SQL数据库中有Oracle表的完整副本(通常在不同的SQL Server模式中。注意,Oracle和SQL Server中的“模式”意味着细微的不同) ODS基本上是源系统的副本。如果您想要10分钟的刷新,那么您需要将增量(仅更改)加载到ODS中。要做到这一点,您需要知道自上次加载ODS以来源代码中发生了什么变化。如果源中有一个“上次更改”字段,这很容易。否则就会变得非常困难 ODS方法与“批量加载”模式保持一致,即数据在层中进行批处理。ODS允许您在不同层进行测试和故障排除 ODS方法不同于“流”方法,后者支持实时报告,但在整个流中包含独立的转换规则 应该在目标表上创建索引,还是在提取数据时创建索引 在加载数据之前,通常应禁用/删除表上的索引,然后再重新生成索引 我计划使用 为记录创建_dt_tm,并在几个月内加载数据。一旦 一切都已加载,我们计划使用updt_dt_tm和加载 在过去10分钟内完成的任何更新 我不知道什么是
updt_dt_tm
,但这听起来是个好主意
连接到数据库是不是每10分钟获取一次数据的好主意
对。你还将如何获得数据
总之,基于增量负载,重点是让一个10分钟的ODS副本工作。然后,下一步是将数据从ODS转换为星型模式
如何使用SSIS包从Oracle提取数据并将其加载到SQL Server DWH中
同样,这是一个非常广泛的问题,我可以在这里为您键入一个完整的方法,但我不认为我的付费客户会喜欢它
有许多设计模式。我更喜欢ELT(Extract Load Transform)ODS方法,它是T-SQL的重量级方法,但根据我的经验,这是最好的方法。在这种方法中,您加载并暂存最近几天更新的记录,然后使用SQL将它们合并到ODS表中
最后一件事:我在你的问题历史中看到你在问条件拆分。我只需要提醒你们,若你们开始在SSIS中使用条件拆分和查找来加载你们的数据,你们的包可能不会运行得很好,你们最终会遇到一些非常复杂的事情,这会让你们的十分钟时间变得很紧张
这实际上可以归结为ETL与ETL方法。如果您不熟悉SQL,那么您可能必须使用ELT(全部登录SSIS包)方法。但根据我的经验,它变得缓慢且难以维护我最近构建了一个具有类似需求的解决方案,但我的解决方案只需几秒钟的延迟就可以将100多个表从Oracle EBS DB复制到“实时BI”系统。然而,我选择Vertica作为数据集成的数据库和流集 StreamsSets是为流媒体而设计的,通过一条数据管道,它可以处理我所有的表。它可以计算出所有列,甚至可以计算出在目标数据库上更新所使用的键 我使用Vertica是因为一个列式MPP数据库可以提供100倍于行数据库的性能,并且不使用需要重建的索引。Vertica比最近的纯云列数据库(如RedShift、Snowflake和BigQuery)更加成熟,并在内存中设计了写优化存储,在磁盘上设计了读优化存储,因此写操作速度非常快。在幕后,元组移动器进程每五分钟压缩一次写入的数据,但查询总是通过合并这两个区域返回最新的数据