Здесь есть пара вещей.
Во-первых, выражение 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
Какого СУБД? Насколько велики таблицы? Это только что началось в существующем запросе, или это новый запрос? –
- Какой тип данных является вашим основным ключом? - Какие индексы у вас есть на этой таблице? –
Насколько велика таблица? Если это 100 000 000 строк, и он должен обновлять каждую строку, не имеет значения, какие индексы у вас есть: это займет некоторое время. Таблица – Eric