2013-08-02 9 views
5

Мы используем MS SQL Server 2005.Почему кластеризованный индекс обновляется при обновлении поля, которое не включено в этот индекс (Ms SQL)?

Привет, Я выполняю инструкцию UPDATE в таблице базы данных. Допустим, эта таблица имеет следующие colums:

int Id PK 
int Column1 
int Column2 

Он также имеет несколько индекс:

Unique Clustered (Id) 
Non-Unique Non-Clustered (Column1) 
Non-Unique Non-Clustered (Column2) 

я следующую операцию:

UPDATE [dbo].[Table] 
    SET Column1 = @Value1 
    WHERE Column1 = @Param1 
     AND Column2 = @Param2 

Фактическое выполнение плана после того, как это выглядит следующим образом: Execution plan

Который говорит, что 86% времени было потрачено на обновление кластерного индекса, whi ch не включает столбец, который я только что изменил.

Эта операция должна выполняться сотни тысяч раз с отключением веб-приложения, что означает, что это очень важно для времени.

Итак, есть ли у кого-нибудь идеи, почему все идет так, и если это можно как-то исправить? Имеет ли смысл этот вопрос? Я готов предоставить дополнительную информацию, если это необходимо.

+5

кластерный индекс магазинов * все * данные для каждой строки. –

+0

Кроме того, оператор показан в комплекте 2 обновления индекса. Посмотрите на свойства. – usr

+1

Добавить состояние и cOLUMN1 <> @ Value1. Taking замок - дорогая часть. – Paparazzi

ответ

5

«Сгруппированный индекс» - это фактическая таблица. Все столбцы таблицы находятся в «кластерном индексе» (за некоторыми исключениями для хранения «вне строки» для логов и т. Д.)

При изменении значения столбца его необходимо изменить в страницы таблицы, а также в любом индексе, в котором находится столбец.

Что касается производительности для быстрого поиска обновляемых строк (для вашего конкретного запроса), то индекс для dbo.Table(Column1,Column2) или dbo.Table(Column2,Column1) был бы наиболее подходящим ,


Если это возможно, что столбец модифицируется уже имеет значение быть назначен (т.е. @ Param1 и @value оба представляют собой то же самое значение, а затем добавить еще один предикат может улучшить производительность, избегая блокировки быть получены на строке .

UPDATE [dbo].[Table] 
    SET Column1 = @Value1 
WHERE Column1 = @Param1 
    AND Column2 = @Param2 
    AND Column1 <> @Value1 

 Смежные вопросы

  • Нет связанных вопросов^_^