Здесь есть пара вещей.
Во-первых, оператор SQL выглядит неработающим. Предложение "FROM" в обновлении предназначено для использования в качестве обновления JOIN'd. Поскольку вы обновляете строки жестко закодированными значениями, делать это не нужно.
Во-вторых, и более эзотерически, если все индексы верны, как вы говорите, то, возможно, вы имеете дело с медленным дисковым вводом-выводом для начальной записи или для области журнала транзакций (отмена в Oracle, журналы в SQL Server и т. д.).
В качестве проверки здравомыслия я бы сделал две вещи. Во-первых, обновлять только те строки, для которых еще не установлены условия. Многие продукты СУБД с удовольствием выполнят физический дисковый ввод-вывод для строки, которая не изменяется (хотя многие этого не делают). Попробуй с лимитом.
Два, примените обновление небольшими партиями. Это может действительно помочь с конфликтами журналов и с более медленными дисками.
Итак, сначала нужно попробовать что-то вроде следующего:
UPDATE auditdata
SET TATCallType = '12'
, TATCallUnit = '1'
FROM auditdata
WHERE TATCallType <> '12'
AND TATCallUnit <> '1'
AND EXISTS( SELECT *
FROM Auditdata_sms_12 a_sns
WHERE a_sns.id = auditdata.ID )
Если вы хотите создавать пакеты, в SQL Server это довольно просто:
SET ROWCOUNT 2000
UPDATE ...
(run continually in a loop via T-SQL or by hand until @@ROWCOUNT = 0)
SET ROWCOUNT 0