重复插入记录更快

时间:2011-08-26 09:14:03

标签: vb.net sql-server-2008

我正在监视Jpg文件的文件夹,需要处理传入的文件。 我解码文件名以获取我想要的所有信息并插入表中,然后将文件移动到另一个文件夹。

文件名已包含我想要的所有信息。例如。

2011--8-27_13:20:45_MyLocation_User1.jpg.

现在我正在使用Insert声明

Private Function InsertToDB(ByVal SourceFile As String, ByVal Date_Time As DateTime, ByVal Loc As String, ByVal User As String) As Boolean

    Dim conn As SqlConnection = New SqlConnection(My.Settings.ConString)
    Dim sSQL As String = "INSERT INTO StageTbl ...."
    Dim cmd As SqlComman
    cmd = New SqlCommand(sSQL, conn)

    ....Parameters Set ...

      conn.Open()
      cmd.ExecuteNonQuery()
      conn.Close()
      conn = Nothing
      cmd = Nothing
    End Function

将为找到的每个文件调用该函数。

这是最有效的方式吗?看起来很慢。我需要处理大约20~50个文件/秒。可能是一个存储过程?

我需要尽快做到这一点。我认为批量插入不适用于此。

请帮忙。

2 个答案:

答案 0 :(得分:1)

批量插入可能适用于此 - 您是否需要它们立即在数据库中,或者您是否可以在内存中构建记录然后将它们分批推送到数据库中?

您是否也是多线程的 - 否则您的端到端流程可能会落后。

另一个解决方案是使用消息队列 - 在每个文件的队列中弹出一条消息,然后有一个进程(在不同的线程上)不断读取队列并添加到数据库中。

答案 1 :(得分:1)

您可以采取以下措施来优化此过程的速度:

  • 不要为每个插件打开和关闭连接。仅这一点就会产生(非常)显着的性能提升(除非你已经使用了连接池)。
  • 如果禁用自动提交并在块中执行插入,则可以获得性能,在每N行之后提交事务(100-1000行是一个很好的数字以尝试启动)。
  • 某些数据库系统提供了一种语法,允许在单个查询中插入多行。 SQL Server没有,但您可能对此感兴趣:http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/
  • 如果有许多用户/进程访问此表,则访问速度可能会很慢,具体取决于您的事务隔离级别。在你的情况下(20-50插入/秒)这不应该有很大的不同。除非您完全了解自己在做什么,否则我不建议您修改此内容:http://en.wikipedia.org/wiki/Isolation_%28database_systems%29http://technet.microsoft.com/es-es/library/ms173763.aspx
  • 我不认为存储过程必然会带来很大的性能提升。您只需每秒解析/计划插入20-50次。仅当存储过程适合您的开发模型时才使用它。如果您的所有其他查询都在代码中,则可以避免使用它。
  • 确保您的瓶颈是数据库(即移动文件不会占用大量时间),但由于操作系统应该擅长这一点,请检查上述要点。如果您发现移动文件是您的瓶颈,在后台延迟或移动文件(另一个线程)可能会有所帮助。