Ускорить вставку МДБ - PullRequest
       6

Ускорить вставку МДБ

3 голосов
/ 12 февраля 2010

Есть ли способ ускорить вставку в МДБ?

 using (StreamReader sr = new StreamReader(_localDir + "\\" + _filename))
  while ((line = sr.ReadLine()) != null)
{
   //sanitize the data
}

Это займет около 20 секунд для ~ 2 млн записей из CSV но когда я добавляю в вставку mdb, я едва могу получить 10 000 записей за 10 минут, так что вы можете видеть, что это займет вечность

 using (StreamReader sr = new StreamReader(_localDir + "\\" + _filename))
 while ((line = sr.ReadLine()) != null)
{
//sanitize the data
using (OleDbConnection con = new OleDbConnection(_conStr))
 using (OleDbCommand cmd = new OleDbCommand())
 cmd.Parameters.AddWithValue...//I have 22 params
cmd.ExecuteNonQuery();

}

Есть ли лучший способ? Пул подключений? многопоточности? Вот мой constr Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = mypath; Jet OLEDB: Engine Type = 5"

Привет

_Eric

Ответы [ 5 ]

5 голосов
/ 12 февраля 2010

Можно ли использовать запрос, который вставляется непосредственно из CSV? Например:

SELECT ID,Field1 INTO NewTable 
FROM [Text;HDR=YES;FMT=Delimited;IMEX=2;DATABASE=C:\Docs\].Some.CSV

Вы можете использовать что-то похожее с нестандартными разделителями, но вам потребуется файл Schema.ini в том же каталоге, что и файл для импорта. Он должен содержать только:

[tempImportfile.csv]
TextDelimiter='

Вам нужно будет немного изменить строку подключения, похоже, это работает:

Text;HDR=YES;FMT=Delimited;DATABASE=C:\Docs\
4 голосов
/ 12 февраля 2010

Microsoft Jet для обработки Sql-анализа (INSERT / UPDATE) в целом работает медленно. Другими словами, у вас может быть самый эффективный из возможных кодов, но проблема заключается в Jet. Имейте в виду, что в исходной публикации ваши подключения (открыть файл, создать блокировку, найти файл, вставить строку, удалить блокировку, закрыть файл, удалить объект) для каждой строки. Вам нужно подключиться ОДИН РАЗ (вне времени), прочитать строки, сгенерировать Sql (OleDbCommand) и затем выполнить.

3 голосов
/ 12 февраля 2010

Вероятно, вы бы ощутили некоторые преимущества в производительности, переместив цикл внутрь используемых блоков. Создайте 1 соединение / команду и выполните ее N раз вместо создания N соединений / команд.

1 голос
/ 12 февраля 2010

Еще одно изменение, которое может ускорить его еще немного, - это подготовить команду один раз и создать все параметры. Затем в цикле просто назначьте значения параметров и выполняйте их каждый раз. Это может избежать синтаксического анализа и семантической проверки оператора на каждой итерации и должно сократить время. Однако я не думаю, что это будет существенным улучшением. Синтаксический анализ оператора должен составлять относительно небольшую часть общей стоимости, даже если он анализируется каждый раз.

0 голосов
/ 13 сентября 2013

Я нашел очень хорошее решение здесь: Запись большого количества записей (массовая вставка) в Access в .NET / C # Вместо использования OleDb используйте DAO.

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