【问题标题】:ssis upserting 10^8 rows - process by batch?ssis upserting 10^8 行 - 批量处理?
【发布时间】:2014-10-01 20:26:29
【问题描述】:

我必须从各种 SQL Server 表(大约 3 亿行)中收集大量数据,并将它们插入到我的数据仓库中的单个事实表中。

1/ 导入所有这些行的最佳策略是什么?

2/ 这是批量导入的好习惯吗?一批应该有多大? 10k 行可以吗?

【问题讨论】:

  • 我计划像这样执行此导入:1/ 在每个源表中添加一个新列,称为 ImportedDate 作为 DATETIME2 NOT NULL 2/ 创建一个循环容器,读取前 10k 行 WHERE ImportedDate IS NOT NULL 3/ 决定执行更新(通过 Ole DB命令)或通过查找任务在目标中插入行 4/ 更新目标表中已处理行的 ImportedDate 列。
  • 对于您的更新,我选择您将所有更新放在一个临时表中,然后从中执行一次更新。您将永远等待 SSIS 更新完成。
  • @ElectricLlama:你的意思是导入一个临时表中的所有数据,然后批量处理它们,然后从临时表中删除处理过的行?
  • 可能。要点是不要使用 SSIS 更新,因为它很慢。您需要多久执行一次此操作,是否一次性完成?
  • 同意@rvphx。这也取决于您的环境。无论如何.. 使用 SSIS 将单个表从源数据库导入到目标数据库中的单个暂存表。处理并保存到 Fact 表中的存储过程。如果您需要重新加载 Fact 表,请截断 Staging 和 Fact 表以重新加载。在 SSIS 中使用数据流任务导入表和执行 SQL 任务对象来启动存储过程。如果您有空间将源数据库还原到数据仓库 SQL Server 实例并使用 SQL 脚本或存储过程进行处理,则另一种选择

标签: sql-server ssis ssis-2008 large-data


【解决方案1】:

我设计这个的方式是为了在 3 个不同层之间移动数据

  1. 着陆区
  2. 暂存区(大部分查找和键替换发生的地方)
  3. 数据仓库

我们在着陆区创建了批量表格,没有任何类型的键或任何东西。我们只需将数据放在该区域,然后将其沿系统进一步移动。

我设计包的方式是在 SQL Server 中创建 2 个非常简单的表,每个表有 4 列。第一个表,我称之为 ToBeProcessed,第二个(很明显)Processed。 我的列是

1)

dbo.ToBeProcessed

(ID INT IDENTITY (1,1),

BeginDate DATETIME,
EndDate DateTime,
Processed VARCHAR(1)

)

2)

 dbo.Processed

( ID INT IDENTITY(1,1),
ProcessedEndDate DATETIME,
TableName VARCHAR (24),
CompletedDateTime DATETIME
)

我所做的是用每个跨越一周的日期范围填充 ToBeProcessed 表。例如,第一行是从 01/01/2014 到 01/07/2014,下一行是从 01/08/2014 到 01/15/2014 等等。这样可以确保您不会重叠您正在提取的任何数据。

在 SSIS 端,您可能希望为每个循环容器创建一个并逐一解析第一个表中的所有日期。您可以使用您将创建的变量参数化您的数据流任务,以存储来自 For each 循环容器的日期。每次处理一周的数据时,您只需将结束日期插入第二个表。

这可确保您跟踪已处理的数据。这样做的原因是因为如果包因任何原因失败,您可以从失败点开始,而无需取消已处理的所有数据(我认为在您的情况下,您可能希望关闭 T-Logs如果您不在生产环境中工作)。

至于更新插入,我认为使用合并语句可能是一种选择,但这完全取决于您的处理时间范围。如果您希望在周末扭转这种局面,我建议您在数据集上使用存储过程,并确保您的日志表可以随着数据量的增加而轻松增长。

这是对我有用的快速而肮脏的方法的简要总结。这并不意味着它是最好的方法,但肯定为我完成了工作。如果您有任何问题,请告诉我。

【讨论】:

  • 我喜欢你的方法!为什么需要同时拥有着陆区和暂存区?
  • 我们必须将批量表(历史数据)与日常 ETL 表分开。我们创建了登陆区域,以便我们可以备份历史数据,以防万一数字没有任何意义时需要重新计算。暂存区更像是最终的数据库,所有事情要么被清除(在查找和东西方面)要么被拒绝。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2019-08-22
  • 2019-11-03
  • 2019-05-26
相关资源
最近更新 更多