ここでいくつかのことが行われます。
まず、SQL ステートメントが壊れているように見えます。更新の "FROM" 句は、JOIN された更新として使用するように設計されています。ハードコーディングされた値で行を更新しているため、その必要はありません。
第二に、より難解なことに、インデックスがすべてあなたが言うように正しい場合、おそらく最初の書き込みまたはトランザクション ログ領域 (Oracle では元に戻す、SQL Server ではログなど)。
健全性チェックとして、2 つのことを行います。1 つ目は、まだ条件が設定されていない行のみを更新することです。多くの DBMS 製品は、変更されない行に対して物理ディスク I/O を問題なく実行します (ただし、多くの製品は変更しません)。限界でやってみる。
2 つ目は、更新プログラムを小さなバッチで適用することです。これは、ログの競合やディスクの速度が遅い場合に非常に役立ちます。
したがって、次のようなものを最初に試してください。
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