Триггерный код (потому что он должен запускаться при каждом обновлении данных) должен быть эффективным и должен учитывать несколько вставок записей. Вы преуспели на втором, но не первом. Вы сделали это слишком сложным и использовали такие вещи, как Not в выражениях, которые обычно менее эффективны, чем использование левого соединения. Временные таблицы здесь не нужны (я бы никогда не подумал об их использовании в триггере), поскольку они увеличивают неэффективность триггера. Нет причин не писать
Из вставленного я
вместо
ОТ (выберите dunsId, имя из #magic) i
Первый, скорее всего, будет быстрее, его проще читать и обслуживать.
Здесь:
JOIN (выберите случай, когда charindex ('/', url) <> 0 затем слева (url, charindex ('/', url) -1), иначе url end urlMatch, * из компаний) c ON dandb.url = c.urlMatch
Вы выбираете все поля в таблице, даже если вы используете только одно из них. Зачем? Вы также ведете эту регистрационную запись по всем записям в компании, хотя после присоединения вам могут не понадобиться все из них.
Также в целом я бы избегал использовать select *, но особенно в триггере. Предположим, вы вставляете в другую таблицу и используете select * из некоторой таблицы, присоединенной к вставленной или удаленной. Добавление столбца к этой таблице вызовет сбой триггера и остановит все изменения данных, пока он не будет исправлен.
Вы также использовали функцию в триггере. Это может быть мучительно медленно, если у вас есть большой вкладыш. Я предлагаю вам проверить это, обновив большую группу записей и посмотреть, что произойдет. Все изменения данных происходят не только из пользовательского интерфейса, по одной записи за раз. Будут времена, когда одно поле обновляется из специального запроса в Management Studio (когда все цены должны быть скорректированы на 10%, как самый простой пример, который приходит на ум.) Ваш триггер должен быть в состоянии обрабатывать эти типы, если обновления, а также те, которые вы ожидаете. Я бы запустил тестовый пример, обновляющий 100000 строк, и увидел бы, насколько сильно этот триггер замедляет работу.
Возможно, это не совсем отвечает вашей проблеме, но триггер просто далек от оптимального, я должен был это сказать.