Почему я вызываю обновление кластерного индекса? - PullRequest
26 голосов
/ 22 мая 2009

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

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

Столбец «ID» представляет собой INT PRIMARY KEY с ограничениями IDENTITY. Флаги это БОЛЬШОЙ, НЕ НУЛЬ..

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

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

Ответы [ 2 ]

29 голосов
/ 22 мая 2009

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

12 голосов
/ 22 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...