我已经构建了一个SSIS包来将CSV文件中的数据加载到数据库表中。首先使用power shell脚本从Azure blob下载CSV文件,然后将每个文件加载到SQL Server中的目标表。
所以我设置了一个 ForEach枚举器来遍历所有文件并将数据加载到目标表,但过程太慢。 每个文件只有一行数据(大约30列),所以要加载说20k行,我必须循环遍历20k文件,程序包需要HOURS才能运行。
我试图寻找替代方案来加载来自多个文件的数据但却找不到任何具体的解决方案。一个人Hilmar有interesting solution使用脚本任务来提高性能但是我没有任何C#知道 - 怎么回事。
有没有人遇到类似的问题或克服同样的问题?或者,如果有人有一个示例使用脚本任务加载多个文件,它会有很多帮助(?)
感谢任何帮助。
答案 0 :(得分:1)
结束评论会话这里是一个脚本Merging multiple CSV files into one using PowerShell,一次性加载所有数据(假设所有文件格式相同),通过微调来遍历子文件夹并附加插入符号返回到结尾每个文件:
if (Test-Path "COMBINED_FILE.csv") {Remove-Item "COMBINED_FILE.csv"} $getFirstLine = $true Get-ChildItem "SOURCE_ROOT_FOLDER\*.csv" -Recurse -File | foreach { $filePath = $_.FullName $lines = Get-Content $filePath $linesToWrite = switch($getFirstLine) { $true {$lines} $false {$lines | Select -Skip 1} } + [System.Environment]::NewLine $getFirstLine = $false Add-Content "COMBINED_FILE.csv" $linesToWrite }
答案 1 :(得分:0)
有点觉得这里有点狡猾。 我将我的软件包部署到Integration Services,并通过SQL代理安排了相同的运行。
猜猜是什么!!一个包装需要12个小时才能加载6k文件,现在可以在30分钟内加载20k文件。我从未想过在SSDT中执行包并在服务器上执行它会产生如此对比的结果。现在我不确定这个的确切原因是什么,但我想在SSDT中记录所有执行结果所浪费的时间可能会产生很大的不同。
将搜索此类行为的确切原因,但执行时间的显着减少对我来说是可以接受的,因为我没有大量文件来加载每天的数据。
如果我不需要原始文件,那么连接文件选项会不会因为我们现在添加了一个邮件任务来将带有错误的文件(截断/数据)发送回开发团队。
感谢@everyone提供的帮助。