У меня есть таблица в базе данных SQL Server с кластеризованным индексом по первичному ключу. Таблица имеет 1 миллион строк. Если я удаляю 10K строк из таблицы, реструктурируется ли индекс во время операции удаления?
Операция удаления является частью хранимой процедуры. В то же время, более чем один клиент может выполнять хранимую процедуру, однако каждый отдельный прогон будет удалять свой собственный набор строк (уникально идентифицируемых первичным ключом). Я получаю блокировку блокировки ключа (типа U), когда несколько клиентов выполняет процедуру. Блокирующая блокировка принадлежит строке из той же таблицы и не является частью какой-либо одновременно выполняемой транзакции. Не должно быть никаких блокировок, поскольку каждый прогон пытается удалить свой собственный набор строк. Повышение блокировки не происходит, поскольку оно отключено.
Я подозреваю, что операция удаления должна приводить к перебалансировке индекса, и, следовательно, в процессе реструктуризации может потребоваться блокировка ключа в любой строке таблицы.
Буду очень признателен за любое мнение по этому поводу.
источник
Ответы:
Чтобы ответить на вопрос в заголовке, сбалансировалось ли B-дерево во время удаления, ответ будет «нет», по крайней мере, в следующем минимальном тестовом примере.
Следующая демонстрация запускает команды, которые лучше всего оставить для тестовой среды.
Эта демонстрация показывает, что удаление может привести к очень несбалансированному b-дереву с практически всеми данными на одной стороне.
источник