C# 在SQL Server中转置和插入大型可变列数据文件时出现性能问题

C# 在SQL Server中转置和插入大型可变列数据文件时出现性能问题,c#,sql-server,ssis,performance,C#,Sql Server,Ssis,Performance,我目前正在从事一个项目,我们有一个大型数据仓库,每天从许多不同的来源导入数GB的数据。我们有许多具有不同格式和结构的文件,所有这些文件都被导入到两个基表中,然后我们通过存储过程对这些基表进行转置/透视。这部分很好用。然而,最初的导入速度非常慢 我们不能使用SSIS文件连接管理器,因为每个文件的列可能完全不同,因此我们在C#中有一个自定义对象模型,它将数据的行和列转换为两个基表;一个用于列名,另一个用于每个单元格中的实际数据,与属性表中的记录相关 示例-数据文件: 示例-数据库表: SQL

我目前正在从事一个项目,我们有一个大型数据仓库,每天从许多不同的来源导入数GB的数据。我们有许多具有不同格式和结构的文件,所有这些文件都被导入到两个基表中,然后我们通过存储过程对这些基表进行转置/透视。这部分很好用。然而,最初的导入速度非常慢

我们不能使用SSIS文件连接管理器,因为每个文件的列可能完全不同,因此我们在C#中有一个自定义对象模型,它将数据的行和列转换为两个基表;一个用于列名,另一个用于每个单元格中的实际数据,与属性表中的记录相关

示例-数据文件:

示例-数据库表:

SQL插入当前通过循环所有数据行并将值附加到SQL字符串来执行。这将构造一个大的动态字符串,然后在最后通过SqlCommand执行该字符串

问题是,即使在1MB文件中运行也需要大约一分钟的时间,因此当涉及到大文件(200MB等)时,处理单个文件也需要几个小时。我正在寻找其他方法的建议,这些方法可以提高性能并加快过程

对于循环的结构,我可以做一些事情来减少字符串大小和字符串中SQL命令的数量,但理想情况下,我正在寻找一种更干净、更健壮的方法。抱歉,如果我没有很好地解释自己,我会尽量提供更多的细节,如果需要的话


关于如何加快这个过程有什么想法吗?

一个想法-您是否反复返回数据库以找到合适的属性值?如果是这样,将重复查询切换为针对保留在客户端的记录集的查询将大大加快速度


这是我以前做过的-涉及4个参考表。创建一个本地记录集并进行适当的筛选,将进程的速度从2.5小时提高到3分钟左右。

动态字符串将变慢。每个SQLCommand都是对数据库的单独调用。将输出作为批量插入操作进行流式处理会更好

我知道您的所有文件都是不同的格式,所以您必须在代码中解析和取消PIVOT,才能将其放入EAV数据库表单中

但是,由于输出是在一个一致的模式中,因此最好使用单独的连接管理器和内置的unpivot操作符,或者在脚本任务中向公共输出中的数据流添加多行(就像当前为每个输入行构建SQL INSERT…INSERT…INSERT时所做的那样)然后让它全部流到一个目的地

i、 e.读取数据并在脚本源中,将FileID、RowId、AttributeName和Value分配给多行(因此这是在代码中执行unpivot,但不是生成不同数量的插入,而是根据输入行将不同数量的行插入到数据流中)

然后通过查找将其从AttributeName传递到AttributeID(错误处理具有无效属性的行)


直接流到OLEDB目的地,应该会快得多。

为什么不在每个数据库中存储所需的任何引用表,并在数据库端执行所有查找?或者,在需要键的每个数据库中传递一个表类型,将所有引用数据存储在一个中央数据库中,然后在那里执行查找,这可能更好。

Hi Thomas。是的,每次都会执行大量重复的查询来查找属性ID等。事先加载它们肯定会有所帮助。我认为我们还可以做更多的事情,但我想知道是否有更好的方法来实际执行数据插入,而不是构建动态字符串?老实说,我怀疑这一点,而不必写一个文本文件,然后调用批量导入(filestream)例程。他们会使系统有更多的故障点。是的,这是有道理的。我希望今天下午能尝试做一些改变,所以我会让你知道一切进展如何。谢谢,祝你好运!让我们知道你进展如何。我仍在努力让一切正常运行,但我已经减少了DB调用的数量,并继续重新组织代码以删除更多。不过,到目前为止,它确实看起来正在产生巨大的变化。谢谢你的帮助!我已将正确答案更改为这一个,因为我终于有机会适当地查看优化此SSIS包的情况,并且此解决方案提供了迄今为止的最佳解决方案。另一个解决方案很有帮助,确实改善了一些事情,所以我投票支持它,但这个解决方案的速度提高了99%。因此,将这一个标记为正确答案似乎是公平的。@fat_tony,为了以后读者的利益,如果您有时间,请更新您的问题,以说明您实施的最终解决方案的结构的更多细节?我的回答没有给出一个确切的解决方案。这是个好建议。当我有机会的时候,我会更新我的问题,并给出更多关于解决方案的细节。为帮助干杯,抱歉花了这么长时间才抽出时间回应!终于开始写这篇文章了。有关我的博客的详细信息: