提问人:Dizzy49 提问时间:11/3/2023 最后编辑:Dizzy49 更新时间:11/3/2023 访问量:65
为什么 SSIS 导入 8500 条记录所需的时间比通过 SSMS 手动导入要长得多?
Why does SSIS take Significantly Longer to Import 8500 Records than Manually Importing via SSMS?
问:
我有一个有 8 张纸的 Excel 文件。它们都不是特别大,整个文件小于2MB。我尝试导入的工作表有 8500 条记录,大约有 70 列。 如果我在 SSMS 中使用 Task->Import Data from the Database,则导入大约需要 1 分钟。 我创建了一个 SSIS 包,该包刷新了一堆表/文件,并重新创建了我尝试导入的工作表。然后,它创建表(无索引),然后我有一个导入数据的数据流任务。当我在 SSIS 中运行导入任务时,它花了 10 分钟才能完成。
有几件事需要注意。
我已经使用这个软件包大约一年了。我在连接管理器上遇到了各种问题,但我已经能够让它再次启动并运行,并且导入记录需要 10 秒(打开 Excel 文件可能需要 8 秒,导入需要 2 秒)。
在此之前,我的连接管理器再次出现问题。我收到错误,我删除了连接管理器并使用 Excel 2016(我使用 Office 365)重新创建,但它仍然不起作用。我再次尝试使用Excel 2007-2010,它可以工作,但它很慢。AcquireConnection method call to the connection manager "Excel Connection Manager" failed with error code 0xC0202009
为了更好地衡量,我检查以确保设置为我的 CPU 从未达到两位数,我的内存是 20-26%。Run64bitRuntime
FALSE
我发现的其他问题已经很老了,大多数都在尝试远程运行。SQL Server 是 Azure 云,但其他一切都在我的本地 PC 上。
SQL Server 12.0.2 and Visual Studio 2019 (w/ SSIS and SSDT)
答:
加载速度的差异是由于选择了“数据访问模式”。通过 SSMS 生成的包使用“表或视图快速加载”,而你选择了“表或视图”
实现的区别在于 Table 或 View 基本上是单个插入语句,就像 Pez 分配器一样。如果您只想将一些数据添加到表中,表或视图适合您。
如果您有很多数据,那么“快速加载”选项可能是您想要的,因为您会更快地完成。快速加载批量发送数据,这是一个配置选项,并将该数据倒入目标表中。这种方法的缺点是,如果目标表非常忙于查询和更新许多其他进程,则快速加载可以阻止它们,直到它将其所有数据推送到目标。
当您使用 Excel 时,我怀疑即使您加载了一百万行,除非您的 SQL Server 资源严重不足,否则它锁定表的时间也将无关紧要。
正如 Panagiotis Kanavos 明智地指出的那样,性能变慢的另一个机会是数据类型转换失败。Excel 正在提取数据,很可能在每一列上都以 Unicode 格式。如果要将其放入定义良好的表中,则会进行从 DT_WSTR/Unicode 数据类型到非 That 的隐式转换。这不是 SSIS 包的本机功能。您需要使用从源数据类型到目标数据类型的显式转换。此处的选项是“派生列”(我的偏好)或“数据类型转换”组件。我更喜欢派生列,因为我发现我必须在本机转换工作之前对数据进行调整,因此,如果我必须对值进行模糊处理,我也可以处理转换。
评论
"Invalid character value for cast specification".