导入很多xml文件

时间:2013-02-22 09:36:17

标签: c# xml sql-server-2008 sqlbulkcopy

将多个xml文件导入到Sql Server 2008的最佳方法是什么,这些文件的数量非常大(例如:30000),具有不同的模式?

我目前正在遍历每个文件,将数据加载到datatable并使用SqlBulkCopy插入数据,但这需要花费大量时间(大约1.5小时)。

1 个答案:

答案 0 :(得分:3)

这不应该花这么长时间。根据我的估计,你获得了大约600MB的数据;你应该能够毫不费力地接近10MB / s或至少 1MB / s - 这意味着1-10分钟应该很容易实现。

怎么做:

  • 确定哪个部分花了这么长时间
  • 列出可能出现的瓶颈
  • 测试每个理论,直到找到罪魁祸首
  • 实施变通办法。

没有更多细节,很难准确,但我可以推测:

  • SqlBulkCopy通常很快,因此您的插入可能不是瓶颈。你可以比数据表快一点,但它可能不是问题。
  • DataTable可以拥有"索引&#34 ;;即主键和约束。这些实施效率非常低 - 这些肯定会导致问题。
  • 虽然SqlBulkCopy速度很快,但许多行的情况最佳。{li>如果您每SqlBulkCopy只复制一个文件,则意味着30000个调用,并且数据库端可能至少有30000个fsyncs。您应该只使用一个SqlBulkCopy
  • 您的数据库可能对您插入的行有索引或约束;这些会严重限制性能 - 检查数据库负载。
  • .NET中的大多数xml阅读器相当快,但单个线程上的10MB / s可能会推动它。如果您的访问模式特别糟糕(例如,加载一个完整的XmlDocument并使用大量低效循环和/或XPath查询它),您可能会遇到CPU负载问题。
  • 20KB文件相当小。如果您正在从HDD上读取这些内容,要达到1MB / s,您需要每秒读取50秒,即延迟时间为20毫秒。这可能是一个问题,特别是如果文件非顺序地位于磁盘上。并行化可能会有所帮助,但SSD会帮助更多(并且更好)。但是,您发现更低的性能比这更低,因此这可能不是您的主要瓶颈。

考虑到这一点,我将按此顺序查看以下内容

  • 客户端上的磁盘负载(如果磁盘等待时间很长,请考虑SSD和并发)
  • CPU负载 - 配置文件(解析或误用DataTable的效率低下)
  • SqlBulkCopy个实例 - 只使用一个(每个帖子)
  • 数据库加载(摆脱任何可能的索引,包括可能的聚簇索引)

订单的灵感来自于检查此问题的难度。磁盘负载不太可能存在问题,但检查起来很简单,因此您最好从消除这种可能性开始。数据库架构问题不太可能,但它们需要更多的工作来识别(它是哪个索引,我是通过删除它来影响另一个工作流吗?)所以我要检查最后一个。<\ n / p>