Подтвердить что ты не робот

Почему я вызываю обновление кластерного индекса?

Я выполняю следующий оператор:

UPDATE TOP(1) dbo.userAccountInfo
SET           Flags = Flags | @AddValue
WHERE         ID = @ID;

Идентификатор столбца - это INT PRIMARY KEY с ограничениями IDENTITY. Флаги BIGINT NOT NULL.

Путь выполнения указывает, что происходит обновление кластерного индекса. Очень дорогостоящая операция. Там нет индексов, охватывающих флаги или идентификатор, кроме первичного ключа. Я чувствую, что фактический путь выполнения должен быть:

Поиск кластеризованного индекса = > Обновление

4b9b3361

Ответ 1

Таблицы бывают двух вариантов: кластеризованные индексы и кучи. У вас есть ограничение PRIMARY KEY, поэтому вы создали неявно кластерный индекс. Вам придется идти на дополнительную длину во время создания таблицы, чтобы этого не произошло. Любое обновление "таблицы" представляет собой обновление кластерного индекса, так как кластеризованный индекс является таблицей. Что касается обновления кластерного индекса, которое является "очень дорогостоящей операцией", теперь это городская легенда, окружающая основную дезинформацию о том, как работает база данных. Правильный оператор: "Обновление кластерного индекса, которое влияет на кластеризованный ключ, должно обновлять все некластеризованные индексы".

Ответ 2

Кластеризованный индекс - это физическая таблица, поэтому всякий раз, когда вы обновляете какую-либо строку, вы обновляете кластерный индекс.

См. эту статью MSDN