如何获得LINQ to SQL submitchanges的百分比?

时间:2009-03-15 19:27:33

标签: c# sql-server linq-to-sql

我想知道是否还有其他人问过类似的问题。

基本上,我有一个巨大的树,我正在使用LINQ对象在RAM中构建,然后我使用DataContext.SubmitChanges()一次性转储它。

它有效,但我无法找到如何给用户一种视觉指示,表明目前为止查询进展了多远。如果我最终能够实现某种进度条,即使性能损失很小,也会很好。

请注意,我有相当多的行要放入数据库,超过750,000行。 我没有准确计时,但确实需要很长时间才能将它们放入。

编辑:我认为我最好先说明我在做什么。

基本上,我正在从指环王那里建造一个后缀树。因此,存在许多节点,并且某些节点具有与它们相关联的位置(恰好在后缀的末尾处的节点)。我正沿着这些方向构建Linq对象。

suffixTreeDB.NodeObjs.InsertOnSubmit(new NodeObj()
{
    NodeID = 0,
    ParentID = 0,
    Path = "$"
});

在RAM中完全生成后缀树后(只需几秒钟),然后我调用suffixTreeDB.submitChanges();

我想知道的是,如果有更快的方法可以做到这一点。谢谢!

编辑2:我做过秒表,显然需要6分钟才能写出数据库。

4 个答案:

答案 0 :(得分:1)

我建议你划分你正在进行的调用,因为它们是在不同的单独调用中发送的。这也会减少事务的大小(linq在调用submitchanges时会这样做)。

如果将它们分成10块75.000,则可以1/10比例提供粗略估计。

更新1:重新阅读你的帖子和新评论后,我认为你应该看一下SqlBulkCopy。如果您需要改善操作时间,那就是要走的路。请查看此相关问题/答案:What's the fastest way to bulk insert a lot of data in SQL Server (C# client)

答案 1 :(得分:1)

通过使用ctx.Log和ActionTextWriter,我能够获得ctx.submitchanges()的百分比进度

ctx.Log = new ActionTextWriter(s => {
if (s.StartsWith("INSERT INTO"))
    insertsCount++;
    ReportProgress(insertsCount);
});

我的博客文章中提供了更多详细信息 http://epandzo.wordpress.com/2011/01/02/linq-to-sql-ctx-submitchanges-progress/

和stackoverflow问题 LINQ to SQL SubmitChangess() progress

答案 2 :(得分:0)

这不太理想,但您可以创建另一个线程,定期查询您正在填充的表,以计算已插入的记录数。我不知道如果你在一个事务中运行,这将如何/如果它可以工作,因为可能有锁等等。

答案 3 :(得分:0)

我真正认为我需要的是一种Bulk-Insert形式,但看来Linq不支持它。