Я прочитал, что одним из компромиссов для добавления табличных индексов в SQL Server является повышенная стоимость запросов на вставку / обновление / удаление для повышения производительности запросов на выборку.
Я могу концептуально понять, что происходит в случае вставки, потому что SQL Server должен записывать записи в каждый индекс, соответствующие новым строкам, но обновление и удаление для меня немного более мутно, потому что я не могу полностью обернуть голову вокруг того, что должен делать механизм базы данных.
Давайте возьмем DELETE в качестве примера и предположим, что у меня есть следующая схема (простите за псевдо-SQL)
TABLE Foo
col1 int
,col2 int
,col3 int
,col4 int
PRIMARY KEY (col1,col2)
INDEX IX_1
col3
INCLUDE
col4
Теперь, если я сделаю заявление
DELETE FROM Foo WHERE col1=12 AND col2 > 34
Я понимаю, что должен делать движок для обновления таблицы (или кластерного индекса, если хотите). Индекс настроен так, чтобы упростить поиск диапазона удаляемых строк и сделать это.
Однако на этом этапе также необходимо обновить IX_1, и запрос, который я дал, не дает очевидного эффективного способа для механизма базы данных найти строки для обновления. Вынужден ли делать полное сканирование индекса в этот момент? Считывает ли механизм сначала строки из кластеризованного индекса и генерирует более разумное внутреннее удаление по индексу?
Это могло бы помочь мне обернуть голову вокруг этого, если бы я лучше понял, что происходит под капотом, но я думаю, что мой настоящий вопрос заключается в следующем. У меня есть база данных, которая тратит значительное количество времени на удаление, и я пытаюсь выяснить, что я могу с этим сделать.
Когда я отображаю план выполнения для удаления, он просто показывает запись «Удаление кластерного индекса» в таблице Foo, которая перечисляет в разделе сведений другие индексы, которые необходимо обновить, но я не получаю никаких указаний на Относительная стоимость этих других показателей.
Все ли они равны в этом случае? Есть ли какой-то способ, которым я могу оценить влияние удаления одного или нескольких из этих индексов, не испытывая их на самом деле?