Как одновременно обновлять и добавлять новые записи

У меня есть таблица, содержащая более миллиона записей (продуктов). Теперь мне нужно ежедневно обновлять существующие записи и / или добавлять новые.

Вместо того, чтобы делать это по одному (занимает пару часов), мне удалось использовать SqlBulkCopy для работы с кучей записей и мне удалось сделать мои вставки за считанные секунды, но он может обрабатывать только новые вставки. Итак, я думаю о создании новой таблицы, содержащей новые записи и старые записи; а затем используйте эту временную таблицу (на конце SQL) для обновления / добавления в основную таблицу.

Любой совет, как я могу выполнить это обновление?


person Andrew    schedule 10.12.2012    source источник
comment
Да, именно так и нужно.   -  person RBarryYoung    schedule 10.12.2012


Ответы (2)


Один из лучших способов справиться с этим - использовать команду MERGE в SQL. . Mssqltips имеет хороший учебник по нему, он может быть немного сложнее в использовании, чем некоторые другие команды.

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

person TimothyAWiseman    schedule 10.12.2012

Мы обрабатываем эту ситуацию в нашем коде так, как вы описали; у нас есть временная таблица, затем запускаем обновление, где идентификатор во временной таблице совпадает с таблицей, которую нужно обновить, затем запускаем вставку, где идентификатор в обновляемой таблице равен нулю. Обычно мы делаем это для обновлений настроек библиотеки / программы, поэтому это выполняется нечасто для небольших таблиц. Производительность может быть не на должном уровне для такого количества записей или ежедневных прогонов.

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

person sugaredlightning    schedule 10.12.2012
comment
Прямо сейчас, после исследования, я наткнулся на MERGE в SQL; ты пробовал это? - person Andrew; 10.12.2012