2010-09-27 4 views
1

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

Скажем, у нас есть таблица вроде этого:

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.

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

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

Кроме того, я знаю, что данные LOB хранятся в отдельной единице выделения, хотя я не уверен, каковы последствия этого; означает ли это, что установка Binary на null (или заполнение) не должна влиять на фрагментацию кластерного индекса?

+0

Что такое 'ID uniqueidentifier', вы используете' newsequentialid' для заполнения этого? –

+0

Это кластеризованный индекс. Мы используем последовательный генератор ID в NHibernate, который должен делать почти то же самое, что и newsequentialid. – Gavin

ответ

1

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

Да. Вы получите внутреннюю фрагментацию. SQL Server не будет автоматически уплотнять страницу данных, чтобы вернуть пространство. Вы можете использовать инструмент SQL Internals Viewer, чтобы увидеть это. Это не обязательно плохо, но зависит от вашей рабочей нагрузки. Некоторая степень внутренней фрагментации может быть полезной для уменьшения ниже (и даже добавил обдуманно использование FILLFACTOR)

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

Да. Предполагая, что на странице недостаточно свободного места для размещения более длинной строки, вы получите разбиение страниц, чтобы освободить место для новых данных. Логический порядок будет отличаться от физического порядка, и вы получите внешнюю фрагментацию.