Я пытался выполнить следующий запрос:
Update A
SET A.Col1 = B.Col1,
...
A.ColN = B.ColN
FROM A INNER JOIN B
ON (A.Col1 = B.Col1)
WHERE B.Col2 = X AND (A.Col1 <> B.Col1 OR ... OR A.ColN <> B.ColN)
При обновлении запрос затрагивает только 4700 строк (и 7 столбцов). Но это занимает более 10 минут и блокирует других пользователей от многих других таблиц.
Я проверил план запроса, и в результате этого запроса обновляется не менее 12 индексов. Я знаю, что устаревшие базы данных переиндексированы. Сейчас это не моя проблема.
Мой вопрос таков: 7 из обновляемых индексов (и 3 наиболее дорогостоящих) не из таблицы A или таблицы B. Я проверил все триггеры в таблице, и ни один из них не повлиял на две другие таблицы. обновляется.
Как это могло происходить? Какой механизм может вызывать эти фантомные обновления?
Неважно, я обнаружил проблему. Произошло обновление столбца, который был внешним ключом для другой таблицы. Поскольку внешний ключ обновлялся, строки, на которые ссылается внешний ключ, должны были быть обновлены, что привело к обновлению индекса в затронутых таблицах.
У вас есть проиндексированные представления, которые также ссылаются на эти таблицы? Обновление этих таблиц также приведет к обновлению индекса индексированных представлений.