点击事件后插入数千条记录的最有效方法是什么?

时间:2010-01-10 04:12:49

标签: asp.net sql-server-2005 insert

Hai guys,

我使用asp.net和sql server 2005开发了一个用于考勤管理系统的Web应用程序。正如您所知,每天都会进行出勤活动。逐个插入记录是个坏主意我知道,我的问题是

  • 在使用sql server时,Sqlbulkcopy是我唯一的选择,因为我想在点击事件中插入100条记录(即)为包含100名学生的班级插入考勤? 我想逐个插入课程的出席情况吗?

3 个答案:

答案 0 :(得分:7)

除非您每天都要添加特别巨大的出勤记录,否则最好的方法是使用insert语句(我不知道为什么你这么做)已经知道这是一个坏主意,我们的数据库经常处理全天添加的数千万行。

如果您的出勤记录超过这个数字,那么您就是胜利者,让很多人参加您正在运行的任何功能或课程: - )

批量复制和导入通常用于传输大量数据,我的意思是在数据库的整个内容中与灾难恢复站点(以及其他类似的东西)相当。我从来没有把它用在野外用作将小型数据存入数据库的方法。


更新1:

我猜测你的评论是基于你实际上将你的考勤记录逐一输入你的网络应用程序而1,500则需要太长时间。

如果是这种情况,那不是数据库减慢了你的速度,也不是网络应用程序。这是你输入的速度。

该问题的解决方案(如果确实 问题)是为您的Web应用程序提供批量导入功能(如果您愿意,可以直接提供数据库,但在我看来您最好让应用程序完成所有工作。)

这当然假设您输入的数据可以通过电子方式访问。如果你得到的只是带有出勤细节的纸张,你可能会运气不好(尽管有OCR解决方案),尽管如果你能让多人同时做这件事,你可能有机会及时完成方式。招聘1,500名员工,每人应该在5分钟内完成一次: - )

您可以向Web应用程序添加功能,以接受包含出勤详细信息的文件并处理每个条目,并在每个条目的数据库中插入一行。这比手动输入信息要快得多。


更新2:

根据您从Web应用程序启动数据后需要长时间处理数据的最新信息,我不确定您拥有多少数据,但100条记录基本上都不应该花费时间。

瓶颈在哪里我不能说,但你应该对此进行调查。

我知道在过去,我们已经从Web UI中进行了长时间运行操作,我们不希望阻止用户。有很多解决方案,我们实施了两个:

  • 离线操作(即在服务器后台运行),为用户提供ID以检查其他页面的状态。
  • 同样的事情,但一旦完成就通过电子邮件通知用户。

这使他们能够异步地继续他们的工作。

答案 1 :(得分:1)

啊,有了你的更新我相信问题是你需要在点击后添加一堆记录,但这需要太长时间。

我建议一件事不会立即帮助你:

  • 稍微重新考虑您的设计,因为这似乎不是特别好(从DB的角度来看)。但这只是一般猜测,我可能是错的

更有用的建议是:

  • 离线(通过Windows服务或类似方式)

如果花费的时间过长,则需要异步执行,然后通知用户操作已完成。可能他们甚至不需要在身边,你只是不要让他们在完成之前做任何需要数据的功能。希望这个想法有意义。

答案 2 :(得分:0)

最快的一般方法是使用ExecuteNonQuery。

internal static void FastInsertMany(DbConnection cnn)
{
    using (DbTransaction dbTrans = cnn.BeginTransaction())
    {
        using (DbCommand cmd = cnn.CreateCommand())
        {
            cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";
            DbParameter Field1 = cmd.CreateParameter();
            cmd.Parameters.Add(Field1);
            for (int n = 0; n < 100000; n++)
            {
                Field1.Value = n + 100000;
                cmd.ExecuteNonQuery();
            }
        }
        dbTrans.Commit();
    }
}

即使在慢速计算机上,1500插入也需要不到一秒钟。

[reference]