BULK INSERT 任务问题

BULK INSERT Task Issues

首先,我是 SSIS 的新手,所以我仍然不熟悉。

我正在使用 Visual Studio 19 和 SSMS 19

无论如何,我已经在 SSMS 中设置了一个从 .TSV 文件到 table 的 OLE DB 包。问题是执行 500,000 行需要 1 小时 11 分钟。

数据非常多变,因此我在 SSMS 中设置了一个分段 table,它基本上都是 varchar(max) 列。插入所有数据后,我将查看一些聚合,例如 max(len()) 以便更好地优化 table 和 SSIS 包。

无论如何,有 10 个这样的文件,所以我需要创建一个 ForEach 文件循环。这至少需要 (1.17 小时)*10=11.70 小时的总 运行 时间。

我认为这有点长并创建了一个 BULK INSERT 任务,但我遇到了一些问题。 设置起来似乎非常简单。

我将批量插入任务添加到“控制流”选项卡,然后进入“批量插入任务编辑器”对话框。

从这里,我配置了源和目标连接。两者都进行得非常顺利。我的机器上只有一个 SQL 服务器的本地实例,所以我使用了 localhost. 和目标连接的 table 名称。

我 运行 包,它执行得很好,没有任何错误或警告。将大约 600 MB 的 .TSV 文件加载到具有大约 300 列 varchar(max) 的 SSMS table 中需要不到一分钟的时间。

我认为这太快了,确实如此。 没有加载,但是包被执行了!!!

我尝试搜索此问题但没有成功。我也检查了我的连接。

批量插入任务需要数据流任务吗?我需要任何连接管理器吗?我必须为 OLE DB 包配置数据流任务和连接管理器,但我引用的文章没有为批量插入任务执行此操作。

我做错了什么?

非常感谢更精通 SSIS 的人的任何建议。

关于我关于使用派生列代替真实目标的评论,它看起来像下图中的 1。您可以通过几个步骤完成此操作:

  1. 运行 只读取任务,看看这需要多长时间。将总读取限制为样本大小,这样您的测试就不会花费一个小时。
  2. 运行 以派生列为目标的读取任务。这将测试总读取时间,加上将数据加载到内存中的时间。

如果 1) 花费很长时间,则可能表示存在文件所在磁盘读取速度慢的瓶颈,或者如果文件位于共享驱动器上的另一台服务器上,则可能存在网络瓶颈。如果 2) 增加了更多时间,则表明 SSIS 正在 运行ning 服务器上存在内存瓶颈。请注意,在服务器上进行测试是测试性能的最佳方式,因为它消除了很多可能不存在的问题,例如网络瓶颈和内存限制。

最后,请打开下面标记为 2) 的功能,AutoAdjustBufferSize。这将更改 DefaultBufferSize(缓冲区中的最大内存)和 DefaultBufferMaxRows(每个缓冲区中允许的总行数,这些是您在 运行 交互包时在数据流中的箭头旁边看到的数字)。因为您的列大小太大,这将提示服务器最大化缓冲区大小,从而为您提供更大更快的管道来推送数据。

最后一点,如果您添加了真正的目的地并且这对时间有重大影响,您可以查看目标 table 的问题。确保没有包括聚簇索引在内的索引,确保 tablock 处于打开状态,确保没有约束或触发器。