Как сделать массивную вставку - PullRequest
2 голосов
/ 01 сентября 2010

У меня есть приложение, в которое я должен вставить в базу данных, с SQL Server 2008, в группы из N кортежей, и все кортежи должны быть вставлены, чтобы быть успешными, мой вопрос заключается в том, как вставить эти кортежи в случае, если кто-то из них потерпит неудачу, я делаю откат, чтобы удалить все кортежи, которые были вставлены правильно.

Спасибо

Ответы [ 6 ]

3 голосов
/ 01 сентября 2010

На SQL Server вы можете рассмотреть возможность выполнения массовой вставки .

2 голосов
/ 01 сентября 2010

В .NET вы можете использовать SQLBulkCopy .

Табличные параметры (TVP) - это второй маршрут.В своем операторе вставки используйте WITH (TABLOCK) в целевой таблице для минимального ведения журнала.Например:

INSERT Table1 WITH (TABLOCK) (Col1, Col2....)
SELECT Col1, Col1, .... FROM @tvp

Оберните ее в хранимую процедуру, которая представляет @tvp в качестве параметра, добавьте некоторую обработку транзакций и вызовите эту процедуру из своего приложения.

Вы можете даже попытаться передать данныев виде XML, если он имеет вложенную структуру и разделяет его на таблицы на стороне базы данных.

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

Если вы вставляете данные непосредственно из программы, кажется, что вам нужны транзакции. Вы можете запустить транзакцию непосредственно в хранимой процедуре или из адаптера данных, написанного на любом языке, который вы используете (например, в C # вы можете использовать ADO.NET).

После того, как все данные были вставлены, вы можете зафиксировать транзакцию или выполнить откат, если произошла ошибка.

См. Скотта Митчелла «Управление транзакциями в хранимых процедурах SQL Server» для получения подробной информации о создании, фиксации и откате транзакций.

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

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

0 голосов
/ 01 сентября 2010

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

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

Если транзакция сложная (каждая строка влияет на десятки таблиц и т. Д.), То запускайте их в транзакциях небольшими партиями.

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

0 голосов
/ 01 сентября 2010

Для MySQL посмотрите ЗАГРУЗКА ДАННЫХ INFILE , которая позволяет вставлять из файла на диске.

Также см. Общее обсуждение MySQL по Скорость операторов INSERT .

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

...