Задача
Давайте получим некоторую ясность, потому что это общая проблема, серьезная проблема для каждой компании, использующей SQL Server.
Эта проблема и необходимость CREATE CLUSTERED INDEX неправильно поняты.
Согласился, что иметь постоянный кластерный индекс лучше, чем не иметь его. Но это не главное, и в любом случае это приведет к длительному обсуждению, поэтому давайте отложим это и сосредоточимся на опубликованном вопросе.
Дело в том, что у вас есть существенная фрагментация в Heap . Вы продолжаете называть это «таблицей», но на физическом уровне хранения данных или уровне DataStructure такого нет. Таблица - это логическая концепция, а не физическая. Это коллекция физических DataStructures. Коллекция представляет собой одну из двух возможностей:
Heap
плюс все некластеризованные индексы
плюс текстовые / графические цепочки
или кластерный индекс
(исключает кучу и один некластеризованный индекс)
плюс все некластеризованные индексы
плюс текстовые / графические цепочки.
Кучи плохо фрагментированы; чем больше разбросанных (случайных) вставок / удалений / обновлений, тем больше фрагментация.
Нет способа очистить кучу, как есть. MS не предоставляет услуги (другие поставщики делают).
Решение
Однако мы знаем, что Create Clustered Index полностью переписывает и переупорядочивает кучу. Поэтому метод (не хитрость) состоит в том, чтобы создать кластеризованный индекс только с целью дефрагментации кучи и затем отбросить ее. Вам нужно свободное место в БД table_size x 1.25.
Пока вы на нем, во что бы то ни стало, используйте FILLFACTOR, чтобы уменьшить будущую фрагментацию. Затем куча займет больше выделенного пространства, что позволит использовать в будущем обновления, удаления и расширения строк из-за обновлений.
Примечание
Обратите внимание, что существует три уровня фрагментации; это касается только Уровня III, фрагментации внутри Кучи, которая вызвана Отсутствием кластерного индекса
В качестве отдельной задачи в другое время вы можете рассмотреть возможность реализации постоянного кластерного индекса, который полностью устраняет фрагментацию ... но это отдельно от опубликованной проблемы.
Ответ на комментарий
SqlRyan:
Хотя это не дает мне волшебного решения моей проблемы, оно ясно показывает, что моя проблема является результатом ограничения SQL Server, и добавление кластеризованного индекса - единственный способ «дефрагментировать» кучу.
Не совсем. Я бы не назвал это «ограничением».
Метод, который я дал для устранения фрагментации в куче, заключается в создании кластеризованного индекса и последующем его отбрасывании. Т.е. временно, единственной целью которого является правильное дробление.
Реализация кластеризованного индекса в таблице (навсегда) является гораздо лучшим решением, поскольку она уменьшает в целом Фрагментацию (DataStructure все еще может быть фрагментирована, подробные сведения см. В ссылках ниже), которые гораздо меньше, чем фрагментация, которая происходит в куче.
Каждая таблица в реляционной базе данных (кроме таблиц "pipe" или "queue") должна иметь кластеризованный индекс, чтобы воспользоваться ее различными преимуществами.
Кластерный индекс должен находиться в столбцах, которые распространяют данные (избегая конфликтов INSERT), и никогда не должен индексироваться в монотонно увеличивающемся столбце, таком как ID записи 1 , что гарантирует горячую точку INSERT на последней странице.
1. Идентификаторы записей в каждом файле делают вашу «базу данных» нереляционной системой хранения записей, используя SQL просто для удобства. Такие файлы не имеют баз данных целостности, мощности или скорости реляционных данных.
Эндрю Хилл:
Не могли бы вы прокомментировать «Обратите внимание, что существует три уровня фрагментации; это касается только уровня III» - каковы два других уровня фрагментации?
В MS SQL и Sybase ASE существует три уровня фрагментации, а внутри каждого уровня несколько различных типов .Имейте в виду, что при работе с фрагментацией мы должны сосредоточиться на DataStructures, а не на таблицах (таблица, как описано выше, представляет собой набор DataStructures).Уровни:
Уровень I • Extra-DataStructure
За пределами рассматриваемой DataStructure, в пределах или внутри базы данных.
Уровень II • DataStructure
В соответствующей DataStructure, над страницами (на всех страницах)
Этот уровень чаще всего используется администраторами баз данных.
Уровень III • Страница
В соответствующей DataStructure, в пределах страниц
Эти ссылки предоставляют полную информацию о фрагментации.Они относятся к Sybase ASE, однако на структурном уровне информация относится к MS SQL.
Обратите внимание, что метод, который я дал, - это уровень II, он исправляет фрагментацию уровня II и III.