Более быстрые вставки SQL? - PullRequest
       5

Более быстрые вставки SQL?

7 голосов
/ 08 сентября 2010

Я имею дело с порциями данных по 50 тыс. Строк каждая.Я вставляю их в базу данных SQL с помощью LINQ:

for(int i=0;i<50000;i++)
{
    DB.TableName.InsertOnSubmit
    (
        new TableName
        {
            Value1 = Array[i,0],
            Value2 = Array[i,1]
        }
    );
}
DB.SubmitChanges();

Это занимает около 6 минут, и я хочу, чтобы это занимало намного меньше, если это возможно.Есть предложения?

Ответы [ 3 ]

10 голосов
/ 08 сентября 2010

если вы читаете файл, вам лучше использовать BULK INSERT (Transact-SQL) и если вы пишете столько (50K строк) за один раз из памяти, вы можетелучше сначала записать в плоский файл, а затем использовать Bulk Insert для этого файла.

1 голос
/ 08 сентября 2010

Есть много вещей, которые нужно проверить / сделать.

  1. Сколько дискового пространства выделено для базы данных?Достаточно ли свободно сделать все вставки без автоматического увеличения размера?Если нет, то увеличьте размер файла базы данных, так как он должен останавливать все столько вставок для автоматического изменения размера самой БД.

  2. НЕ делайте отдельные вставки.Они занимают слишком много времени.Вместо этого либо используйте параметры табличных значений (sql 2008), sql массовое копирование или один оператор вставки (в таком порядке предпочтения).

  3. отбрасывает все индексы в этой таблице до и создает зановоих после загрузки.С таким количеством вставок они, вероятно, все равно будут обмануты в ад.

  4. Если у вас есть какие-либо триггеры, рассмотрите возможность их сбрасывать до завершения загрузки.

  5. Достаточно ли у вас оперативной памяти на сервере базы данных?Вам нужно проверить на самом сервере, чтобы убедиться, что он использует ВСЕ доступную оперативную память?Если это так, вы можете подумать о перезагрузке до загрузки ... Сервер SQL имеет тенденцию просто потреблять и удерживать все, что он может получить.

  6. ВдольСтроки оперативной памяти, нам нравится хранить достаточно памяти на сервере, чтобы хранить всю базу данных в памяти.Я не уверен, возможно ли это для вас или нет.

  7. Какова скорость диска?Глубина очереди довольно велика?Кроме замены оборудования, здесь мало что можно сделать.

1 голос
/ 08 сентября 2010

Поскольку вы делаете простую вставку и не получаете большой выгоды от использования LinqToSql, взгляните на SqlBulkCopy , она удалит большинство циклов и уменьшит накладные расходы на стороне сервера Sql, так как Что ж. Вы должны будете сделать очень мало изменений в коде, чтобы использовать его.

Также обратите внимание на предварительную сортировку данных по столбцу, по которому таблица индексируется, поскольку это приведет к лучшему обращению к кэшу при обновлении таблицы SQL-сервером.

Также подумайте, нужно ли вам загружать данные во временную промежуточную таблицу, которая не проиндексирована, а затем в сохраненный процесс для вставки в основную таблицу одним оператором sql. Это может позволить SqlServer распространить работу по индексированию на все ваши процессоры.

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