我必须从各种 SQL Server 表(大约 3 亿行)中收集大量数据,并将它们插入到我的数据仓库中的单个事实表中。
1/导入所有这些行的最佳策略是什么?
2/这是批量导入的好习惯吗?一批应该有多大?10k 行可以吗?
我必须从各种 SQL Server 表(大约 3 亿行)中收集大量数据,并将它们插入到我的数据仓库中的单个事实表中。
1/导入所有这些行的最佳策略是什么?
2/这是批量导入的好习惯吗?一批应该有多大?10k 行可以吗?
我设计这个的方式是为了在 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如果您不在生产环境中工作)。
至于更新插入,我认为使用合并语句可能是一种选择,但这完全取决于您的处理时间范围。如果您希望在周末扭转这一局面,我建议您在数据集上使用存储过程,并确保您的日志表可以随着数据量的增加而舒适地增长。
这是对我有用的快速而肮脏的方法的简要总结。这并不意味着它是最好的方法,但肯定为我完成了工作。如果您有任何问题,请告诉我。