DataSet插入逐渐变长

时间:2014-09-25 13:03:39

标签: c# sql strongly-typed-dataset sql-server-ce-4

与此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();
     }
}

我使用以下内容:

  • C#
  • Visual Studio 2012
  • Sql Server Ce 4.0

0 个答案:

没有答案