BULK INSERT 任务问题

Frosty_Fraz

首先,我是 SSIS 的新手,所以我仍然掌握着一切。

我正在使用 Visual Studio 19 和 SSMS 19

无论如何,我已经将 .TSV 文件中的 OLE DB 包设置为 SSMS 中的表。问题是执行 500,000 行需要 1 小时 11 分钟。

数据非常可变,所以我在 SSMS 中设置了一个临时表,它基本上都是 varchar(max) 列。插入所有数据后,我将查看一些聚合,如 max(len(<column_name>)) 以更好地优化表和 SSIS 包。

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

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

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

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

我运行这个包,它运行得很好,没有任何错误或警告。将大约 600 MB 的 .TSV 文件加载到包含大约 300 列 varchar(max) 的 SSMS 表只需不到一分钟。

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

我试过搜索这个问题,但没有成功。我也检查了我的连接。

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

我究竟做错了什么?

任何来自更精通 SSIS 的人的建议将不胜感激。

马克·沃伊切霍维奇

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

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

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

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

最后要注意的是,如果您添加真正的目的地并且对时间有重大影响,您可以查看目标表的问题。确保没有包含簇索引的索引,确保打开了 Tablock,确保没有约束或触发器。

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章