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