1

将具有不同架构的多个 xml 文件(例如:30000)导入到 Sql Server 2008 的最佳方法是什么?

我目前正在遍历每个文件,将数据加载到datatableSqlBulkCopy用于插入数据,但这需要很长时间(大约 1.5 小时)。

4

1 回答 1

3

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

该怎么办:

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

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

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

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

  • 客户端上的磁盘负载(如果磁盘等待时间很长,请考虑 SSD 和并发)
  • CPU 负载 - 配置文件(低效解析或误用DataTable
  • SqlBulkCopy实例 - 仅使用一个(每个线程)
  • 数据库负载(尽可能删除任何索引,包括可能的聚集索引)

该命令的灵感来自检查此问题的难度。磁盘负载不太可能有问题,但检查起来很简单,因此您不妨从消除这种可能性开始。数据库模式问题并不是那么不可能,但要确定它们需要做更多的工作(它是哪个索引,我是否通过删除它来影响另一个工作流程?)所以我会检查最后一个。

于 2013-02-22T10:24:47.563 回答