Поделиться через


Кучи (таблицы без кластеризованных индексов)

Кучей является таблица без кластеризованного индекса. Для таблиц, сохраненных как куча, может быть создан один или несколько некластеризованных индексов. Данные хранятся в куче без указания порядка. Обычно данные первоначально сохраняются в порядке, в котором строки вставлены в таблицу, но компонент Компонент Database Engine может перемещать данные в куче для более эффективного хранения строк. Поэтому порядок данных нельзя прогнозировать. Чтобы гарантировать порядок строк, возвращаемых из кучи, необходимо использовать предложение ORDER BY. Чтобы указать порядок хранения строк, подготовьте кластеризованный индекс для таблицы, чтобы таблица не была кучей.

ПримечаниеПримечание

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

Когда следует использовать кучу

Если таблица является кучей и не имеет кластеризованных индексов, требуется просмотреть всю таблицу (выполнить просмотр таблицы), чтобы найти любую строку. Это приемлемо, если таблица очень мала, допустим, представляет собой список 12 региональных офисов компании.

Если таблица сохранена как куча, отдельные строки идентифицируются по ссылке на идентификатор строки (RID), состоящий из номера файла, номера страницы данных и слота на странице. Идентификатор строки является небольшой и эффективной структурой. Иногда архитекторы данных используют кучи, если доступ к данным осуществляется только через некластеризованные индексы, а идентификатор RID меньше ключа кластеризованного индекса.

Когда не нужно использовать кучу

Не следует использовать кучу, если данные часто возвращаются в отсортированном порядке. Кластеризованный индекс для столбца сортировки поможет избежать операции сортировки.

Не используйте кучу для часто группируемых данных. Данные необходимо сортировать перед группировкой, и кластеризованный индекс для столбца сортировки поможет избежать операции сортировки.

Не следует использовать кучу, когда из таблицы часто запрашиваются диапазоны данных. Кластеризованный индекс для гистограммы диапазонов позволит избежать сортировки всей кучи.

Не используйте кучу, если некластеризованные индексы отсутствуют, а таблица большая. В куче, чтобы можно было найти любую строку, должны считываться все строки кучи.

Управление кучами

Чтобы создать кучу, создайте таблицу без кластеризованного индекса. Если в таблице уже содержится кластеризованный индекс, удалите кластеризованный индекс, чтобы преобразовать таблицу в кучу.

Чтобы удалить кучу, создайте кластеризованный индекс в ней.

Чтобы перестроить кучу с целью освобождения нерационально используемого пространства, создайте в ней кластеризованный индекс, а затем удалите его.

ПредупреждениеВнимание!

Создание или удаление кластеризованных индексов требует перезаписи всей таблицы. Если у таблицы есть некластеризованные индексы, то все они должны быть созданы повторно при каждом изменении кластеризованного индекса. Таким образом, для перехода с кучи на кластеризованный индекс и обратно может потребоваться продолжительное время и дополнительное место на диске — для переупорядочения данных в базе данных tempdb.

См. также

CREATE INDEX (Transact-SQL)

DROP INDEX (Transact-SQL)

Описания кластеризованных и некластеризованных индексов