У меня примерно 30M строк для вставки обновлений на SQL Server в день, какие у меня параметры?
Если я использую SqlBulkCopy, обрабатывает ли он не вставлять данные, которые уже существуют?
В моем сценарии мне нужно иметь возможность запускать это снова и снова с теми же данными без дублирования данных.
На данный момент у меня есть хранимая процедура с оператором update и инструкция insert, которая считывает данные из DataTable.
Что я должен искать для повышения производительности?
Обычный способ сделать что-то вроде этого - поддерживать постоянную рабочую таблицу (или таблицы), которая не имеет ограничений на них. Часто они могут жить в отдельной рабочей базе данных на том же сервере.
Чтобы загрузить данные, вы очищаете рабочие таблицы, вставляете данные через BCP / bulk copy. Как только данные загружаются, вы делаете все, что нужно для очистки и / или преобразования, для подготовки вновь загруженных данных. Как только это будет сделано, в качестве последнего шага вы переносите данные в реальные таблицы, выполняя операции обновления / удаления / вставки, необходимые для реализации дельта между старыми данными и новым, или просто обрезая реальные таблицы и перезагружая их.
Другой вариант, если у вас есть что-то похожее на постоянный поток данных, в котором может быть установлен, может быть установлен демон для мониторинга поступления данных, а затем вставки. Например, если ваши данные являются плоскими, файлы будут удаляться в каталог по FTP или тому подобное, демон может отслеживать каталог изменений и выполнять необходимую работу (как указано выше), когда материал прибывает.
Одна вещь, которую следует учитывать, если это производственная система, заключается в том, что массовые заявления о вставке / удалении / обновлении, вероятно, вызовут блокировку, пока транзакция будет в полете. Кроме того, гигантский транзакционный сбой и откатывание имеет свои недостатки:
Таким образом, в зависимости от ваших обстоятельств вам может быть лучше делать ваши вставки / обновления / удаления меньшими партиями, чтобы гарантировать, что вы достигнете прогресса вперед. 30 миллионов строк в течение 24 часов работают c. 350 в секунду.
Массовая вставка в холдинг-таблицу затем выполняет либо один оператор Merge, либо оператор Update и Insert. В любом случае вы хотите сравнить свою исходную таблицу с таблицей холдинга, чтобы узнать, какое действие выполнить