При использовании одного обновления (ответ mbeckish) следует помнить, что журнал транзакций (с возможностью отката в случае отмены запроса) будет огромным. Это резко замедлит ваш запрос. Поэтому, вероятно, лучше обрабатывать их блоками по 1000 строк или чем-то подобным.
Кроме того, условие (b.field вроде '%' + a.field + '%') необходимо будет проверить каждую запись в b (миллионы) для каждой записи в a (750 000). Это составляет более 750 миллиардов сравнений строк. Не отлично.
Здесь не поможет и внутреннее чувство "индексного материала". Индекс поддерживает порядок, поэтому первые символы определяют позицию в индексе, а не те, которые вас интересуют.
Первая идея
По этой причине я бы на самом деле подумал о создании другой таблицы и разборе значения long / messy во что-то более приятное. В качестве примера можно было бы просто удалить любой текст с последнего символа '(' и далее. (Предполагается, что все значения следуют этому шаблону). Это упростит условие запроса до (b.field наподобие '%' + a.field)
Тем не менее, индекс здесь также не поможет, поскольку важные символы находятся в конце. Итак, как ни странно, вполне может стоить хранить символы обеих таблиц в обратном порядке. Индекс на вашей временной таблице будет затем использоваться.
Может показаться, что вы потратили столько времени, но в этом случае небольшая выгода принесла бы большую награду. (Например, несколько часов работы позволяют сократить вдвое сравнения с 750 миллиардов до 375 миллиардов. И если вы сможете получить индекс для воспроизведения, вы можете уменьшить его в тысячу раз благодаря поискам по индексу, а не только упорядоченным таблицам ...)
Вторая идея
Предполагая, что вы действительно копируете целевую таблицу во временную таблицу, вы можете извлечь дополнительную выгоду из обработки их в блоках по 1000, также удалив соответствующие записи из целевой таблицы. (Это имеет смысл только в том случае, если вы удаляете значимую сумму из целевой таблицы. Таким образом, после того, как все 750 000 записей были проверены, целевая таблица теперь [например] вдвое меньше того размера, с которого она началась.)
EDIT:
Модифицированная вторая идея
Поместите всю целевую таблицу во временную таблицу.
Предварительная обработка значений, насколько это возможно, для ускорения сравнения строк или даже ввода индексов в игру.
Поочередно просматривайте каждую запись из исходной таблицы. Используйте следующую логику в вашем цикле ...
УДАЛИТЬ поле target WHERE LIKE '%' + @source_field + '%'
IF (@@ row_count = 0)
[нет совпадений]
ELSE
[Соответствует]
Непрерывное удаление ускоряет запрос в каждом цикле, и вы используете только один запрос к данным (вместо одного для поиска совпадений и второй для удаления совпадений)