8

我正在努力提高散装货物的性能;每天有 100 条数百万条记录。

我将其移至使用IDatareader界面代替数据表,并且确实获得了显着的性能提升(每分钟增加 500,000 条记录)。当前设置是:

  • 用于解析分隔文件的自定义缓存读取器。
  • 将流阅读器包装在缓冲流中。
  • IDatareader枚举对象并实现接口的自定义对象读取器类。
  • 然后SqlBulkCopy写入服务器

性能瓶颈的大部分直接在SqlBulkCopy.WriteToServer. 如果我对流程进行单元测试,但仅排除WriteToServer流程在大约 1 分钟内返回。WriteToServer需要额外的 15 分钟 +。对于单元测试,它位于我的本地计算机上,因此数据库位于同一驱动器上,因此不必通过网络复制数据。

我正在使用堆表(无索引;集群或非集群;我玩过各种批量大小,但性能没有重大差异)。

有必要减少加载时间,所以我希望现在有人可以从这个出现中挤出更多的血液。

4

1 回答 1

1

为什么不直接使用 SSIS?

无论如何,如果您从解析到 IDataReader 进行了处理,那么您已经走上了正确的道路。要优化 SqlBulkCopy 本身,您需要将注意力转向 SQL Server。关键是最少记录的操作。您必须阅读这些 MSDN 文章:

如果您的目标是 B 树(即聚集索引表),那么遗憾的是,无法声明高性能批量插入的最重要原则之一,即排序输入行集。就这么简单,ADO.Net SqlClient 没有SSPROP_FASTLOADOPTIONS -> ORDER(Column)(OleDb) 的等价物。由于引擎不知道数据已经排序,它会在计划中添加一个排序运算符,除了溢出时,它还不错。为避免溢出,请使用小批量(~10k)。请参阅我的原始观点:所有这些都只是在 SSIS 中设置的选项和单击,而不是通过 OleDB MSDN 规范进行挖掘......

如果您的数据流开始时未排序或目标是堆,那么我上面的观点是无声的。

但是,实现最低限度的日志记录仍然是获得良好性能的必要条件。

于 2013-03-20T15:13:18.563 回答