Мой проект должен иметь дело с огромной базой данных. В худшем случае это может быть более 80 миллионов строк.
Теперь у меня есть 2 таблицы T1
и T2
. Мне нужно скопировать данные из таблицы T1
в таблицу T2
- если строка в таблице
T1
уже существует в таблицеT2
(тот же первичный ключ), то обновить данные других столбцов строки вT1
доT2
- иначе вставить новую строку в
T2
Сначала я использую цикл while, чтобы просмотреть 80-миллионную строку в T1
, а затем обновить или вставить в T2
. Это очень очень очень медленно, это занимает более 10 часов. Но если какая-либо строка вызывает ошибку, я могу ее проигнорировать и также перехватить ошибку.
После этого я использую запрос типа:
update Table2
set T2.Column1 = T1.Column1,T2.Column2=T1.Column2
from Table2 T2 JOIN Table1 T1 ON T1.ID=T2.ID
Это намного быстрее, всего 1-> 2 часа. Но если в какой-либо строке есть ошибка, запрос вообще не может быть выполнен.
Итак, мой вопрос:
Есть ли способ, которым приведенный выше запрос может игнорировать строку с ошибкой и продолжать выполнение с действительной строкой?
Если я не могу этого сделать, что я могу сделать, чтобы работать быстрее, чем первый метод, а также может поймать строку ошибки?
p/s: я попытался разбить таблицу на несколько небольших частей, а затем обновить или вставить всю небольшую часть одновременно, но это совсем не быстрее.
Я решил проблему с помощью моего второго метода. Я использую TRY_CAST, чтобы предотвратить исключение при вставке или обновлении строки. Любые недопустимые данные будут NULL. После окончания я сравниваю 2 таблицы и нахожу другую строку. Эта строка является строкой ошибки.