Будет ли изменение фрагмента данных строки кластеризованным индексом?
Теперь я понимаю, что кластерный индекс содержит все данные строки, а не только поля индекса. Я пытаюсь понять последствия этого в отношении фрагментации.
Скажем, у нас есть такая таблица:
create table Files
(
ID uniqueidentifier not null,
Field1 nvarchar(300) null,
Field2 nvarchar(300) null,
Field3 nvarchar(300) null,
Binary varbinary(max) null
)
Теперь предположим, что все эти строки заполнены данными, а затем в некоторых из более ранних строк в кластеризованном индексе вы внезапно установили для Field1, Field2, Field3 и Binary значение null.
Одним из следствий этого, как мне кажется, довольно наивным, является то, что очистка всех этих значений создаст пробелы, и индекс станет фрагментированным. Я предполагаю, что строки все еще находятся в правильном порядке, так что, это действительно фрагментация индекса?
Или вы можете думать об этом по-другому; если все они пустые для начала и вы вставляете данные, вам в конечном итоге приходится перетасовывать данные на разные страницы, а также получать фрагментацию индекса?
Кроме того, я знаю, что данные больших объектов хранятся в отдельной единице распределения, хотя я не уверен, каковы последствия этого; Означает ли это, что установка Binary в null (или заполнение) не должна влиять на фрагментацию кластерного индекса?
1 ответ
Одним из следствий этого, как мне кажется, довольно наивным, является то, что очистка всех этих значений создаст пробелы, и индекс станет фрагментированным. Я предполагаю, что строки все еще находятся в правильном порядке, так что, это действительно фрагментация индекса?
Да. Вы получите внутреннюю фрагментацию. SQL Server не будет автоматически сжимать страницу данных, чтобы освободить место. Вы можете использовать средство просмотра внутренних данных SQL, чтобы увидеть это. Это не обязательно плохо, хотя зависит от вашей рабочей нагрузки. Некоторая степень внутренней фрагментации может быть полезна для смягчения нижеследующего (и даже добавлена намеренно через использование FillFactor)
Или вы можете думать об этом по-другому; если все они пустые для начала и вы вставляете данные, вам в конечном итоге приходится перетасовывать данные на разные страницы, а также получать фрагментацию индекса?
Да. Предполагая, что на странице недостаточно свободного места для размещения более длинной строки, вы получите разбиения страницы, чтобы освободить место для новых данных. Логический порядок станет отличным от физического, и вы получите внешнюю фрагментацию.