我是SSIS的新手,我们有一个客户需要处理相当大的数据集。
一个表包含超过 1.9 亿行。每个月,他们都会用CSV文件(大小约为40GB)中的数据替换这些数据。这是作为 SSIS 包中的一个步骤完成的。
现在,他们只想替换特定日期(CSV 文件中的最小日期)之后的数据,因此他们只发送 2010 年及以后的数据,而不是从 1997 年开始发送数据。我们处理这个问题的方式是:
- 截断"temp_table"(SQL 语句任务)
- 从"data.csv"(平面文件源)读取所有数据
- 组 播
- 将所有数据插入"temp_table"(OLE DB 目标)
- 这是每批 75k 行的批量完成 的
- 将变量"minDate"设置为"data.csv"(脚本组件)中的最小日期值
- 将所有数据插入"temp_table"(OLE DB 目标)
- 组 播
- 删除"destination_table"中日期值大于"minDate"的所有行(SQL 语句任务)
- 这是每批 100k 行的批量完成 的
- 插入从"temp_table"到"destination_table"的所有行(OLE DB 源 -> OLE DB 目标)
- 这是每批 75k 行的批量完成 的
使用这种方法,我们以平均 60k 行/秒的速度将数据插入到"temp_table"。
"destination_table"中的删除阶段删除 ~40k 行/秒,第二个插入阶段(从"temp_table"到 "destination_table")以 ~80k 行/秒的速度运行。
这是此类工作的平均速度吗?是不是太慢了?你会怎么做来改进它?
博士
我们使用 SSIS 以每分钟 ~4-500 万行的速度将数据插入到 MSSQL 数据库表中,并以每分钟 ~250 万行的速度删除数据。这是可以接受的吗?
行/秒平均值取决于每种情况。要知道它是否足够,我们必须知道您的最终表是如何配置的,哪些是数据库服务器的硬件配置......
为了提高性能,我们总是首先看到 I/O。如果我们能用书面形式做某事或在阅读中做某事......
在写中,我们可以做这样的事情:使用名为"平衡数据分发服务器"的 SSIS 组件,该组件使用处理器的强大功能进行并行写入。使表分区在多个磁盘中以同时写入数据。
在读取过程中,您可以将文件分区为多个文件以同时读取。
我不知道我是否帮过你...但这就是我的想法。