基于此处提出的想法,我创建了一个QueuedDataReader
将 a 包装ConcurrentQueue
在 an 中的方法,IDataReader
以便我可以将其传递给SqlBulkCopy
数据库并将数据“流式传输”到数据库中。
它工作正常,而且速度非常快,但日志文件增长非常快,尽管我相信我已经实现了这里、这里(以及许多其他地方)建议的所有内容。
两个可能很重要的细节是:
- 我正在并行插入十几个表(即
Task
每个表一个) - 这些表有
IDENTITY
列(SqlBulkCopy 没有插入其中),所以我不认为“排序”附带条件是相关的。
在此之上:
- 当我开始插入时,表格是空的。
- 我已经在 PRIMARY KEY 上尝试了 CLUSTERED 和 NONCLUSTERED 索引,没有太大的可观察到的差异。
- 我在用着
SqlBulkCopyOptions.TableLock
- 我尝试过使用和不使用 UseInternalTransactions 和各种 BatchSizes。
- 数据库处于简单恢复模式
- 这些表确实有 FK 约束,但我尝试禁用/重新启用它们并且它不会停止日志文件的增长(在插入期间)
问题:
- 我可以查看哪些内容来尝试解决可能导致日志文件增长的问题?