与此question类似,我正在运行数据表,使用数据填充新数据集以进行数据迁移。
迁移插入到数据集中,然后每隔5000条记录使用EricEJ SqlCeBulkCopy方法将添加的行保存到数据库中。
我的问题是,对于第一个记录(5000 ish),每条记录的平均毫秒数约为150-200,但它逐渐增加。在记录11000,这个数字现在大约是475毫秒。
我有一个关闭了EnforceConstraints的类型化数据集。
实际的数据库写入总是需要不到一秒钟,所以我很确定它不是数据库本身,所以我留下了运行每次迭代所花费的代码,这可能是代码本身或者我自己的东西我没有意识到数据集。
数据集是否会增加时间,因为它使用索引或某些未使用EnforceConstraints = false属性关闭的键?
另一个想法是我在插入之前检查是否存在记录,所以我尝试了Linq方法.ANY()和FirstOrDefault()!= null
我遍历数据表,为每条记录读取一些值,然后将它们传递给此方法。
private int MigrateItems(string reference, string brand, string captureSite, string captureOperator, DateTime captureDate, DateTime addedDate, DateTime updatedDate, bool retain)
{
//prepare the inputs
reference = reference.Trim();
int brandID = -1, databaseUpdateID = -1, captureID = -1, insertedRowID = -1;
//get the foreign keys
brandID = MigrateBrands(brand);
databaseUpdateID = MigrateDatabaseUpdates(reference);
captureID = MigrateCaptures(captureSite, captureOperator, captureDate);
//if the item doesn't exist then add it
bool exists = dataSet.Item.FirstOrDefault(a => string.Equals(a.Reference, reference, StringComparison.CurrentCultureIgnoreCase)) == null ? false : true; ;
if (exists == false)
{
var insertedRow = dataSet.Item.AddItemRow(brandID, databaseUpdateID, captureID, reference, retain, updatedDate, addedDate);
insertedRowID = insertedRow.ID;
}
else insertedRowID = dataSet.Item.Single(a => string.Equals(a.Reference, reference, StringComparison.CurrentCultureIgnoreCase)).ID;
return insertedRowID;
}
一旦迭代了5000条记录或完成了所有记录,我就称之为:
private void BulkInsertData()
{
using (var bulkCopier = new SqlCeBulkCopy(connectionString))
{
bulkCopier.DestinationTableName = dataSet.Brand.TableName;
bulkCopier.WriteToServer(dataSet.Brand.Where(a => a.RowState == DataRowState.Added).AsEnumerable());
//(same code for all the tables)
//change all row states to unchanged
dataSet.AcceptChanges();
}
}
我使用以下内容: