【发布时间】:2013-11-07 04:48:25
【问题描述】:
基于here 提出的想法,我创建了一个QueuedDataReader,它将ConcurrentQueue 包装在IDataReader 中,这样我就可以将它传递给SqlBulkCopy 并将数据“流”到数据库中。
它工作正常,而且速度非常快,但日志文件增长非常快,尽管我相信我已经实现了here、here(以及许多其他地方)建议的所有内容。
两个可能很重要的细节是:
- 我正在并行插入十几个表(即每个表一个
Task) - 这些表有
IDENTITY列(SqlBulkCopy 没有插入其中),所以我认为“SORT”附带条件不相关。
除此之外:
- 当我开始插入时,表格是空的。
- 我已经在 PRIMARY KEY 上尝试了 CLUSTERED 和 NONCLUSTERED 索引,没有太大的明显差异。
- 我正在使用
SqlBulkCopyOptions.TableLock - 我尝试过使用和不使用 UseInternalTransactions 以及各种 BatchSizes。
- 数据库处于简单恢复模式
- 这些表确实有 FK 约束,但我已尝试禁用/重新启用它们,但它不会停止日志文件的增长(在插入期间)
问题:
- 我可以查看哪些内容来尝试解决可能导致日志文件增长的问题?
【问题讨论】:
-
使用 fn_dblog 查看日志内容(网上有说明)。那里的大部分业务是什么?也许您可以发布代表性样本的屏幕截图。你试过没有批量大小(0)吗?因为只有第一批发现表是空的。
-
@usr,目前正在尝试批量大小为 0,但这也意味着我必须超时 0,这感觉……很危险。我会调查 fn_dblog。
标签: sql-server performance import sql-server-2008-r2 sqlbulkcopy