Вставлять записи многократно быстрее - PullRequest
0 голосов
/ 26 августа 2011

Я отслеживаю папку для файлов 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 ]

1 голос
/ 26 августа 2011

Существует несколько способов оптимизировать скорость этого процесса:

  • Не открывайте и не закрывайте соединение для каждой вставки.Это само по себе приведет к (очень) значительному повышению производительности (если только вы не использовали пул подключений).
  • Вы можете повысить производительность, если отключите автокоммит и выполните вставки в блоки, фиксируя транзакцию после каждых 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%29 и http://technet.microsoft.com/es-es/library/ms173763.aspx.
  • Я не думаю, что хранимая процедура обязательно обеспечит большую производительностьусиление.Вы только анализируете / планируете вставку 20-50 раз в секунду.Используйте хранимую процедуру, только если она хорошо вписывается в вашу модель разработки.Если все остальные ваши запросы в коде, вы можете избежать этого.
  • Убедитесь, что узким местом является база данных (т. Е. Перемещение файлов не занимает много времени), но, поскольку ОС должна справляться с этим, проверьтеточки выше.Если вы обнаружите, что перемещение файлов является вашим узким местом, задержка или перемещение файлов в фоновом режиме (другой поток) может в определенной степени помочь.
1 голос
/ 26 августа 2011

Массовая вставка может быть применима здесь - вам нужно, чтобы они были в БД мгновенно, или вы могли бы просто создавать записи в памяти, а затем загружать их в базу данных партиями?

Вы также многопоточны - иначе ваш сквозной процесс может остаться позади.

Другим решением было бы использование очередей сообщений - вставка сообщения в очередь для каждого файла, затем создание процесса (в другом потоке), который постоянно читает очередь и добавляет ее в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...