SQL Server heap V. s. кластеризованный индекс

Я использую SQL Server 2008. Я знаю, что если таблица не имеет кластеризованного индекса, то она называется кучей, или модель хранения называется кластеризованным индексом (B-Tree).

Я хочу узнать больше о том, что именно означает хранилище кучи, как оно выглядит и организовано ли оно как структура данных "кучи" (например, минимальная куча, максимальная куча). Любые рекомендуемые показания? Я хочу немного больше внутренних органов, но не слишком глубоко. :-)

спасибо заранее, Джордж!--1-->

3 ответов


памяти, не имеет ничего общего с эти кучи.

куча просто означает, что сами записи не упорядочены (i. e. не связаны друг с другом).

когда вы вставляете запись, она просто вставляется в свободное пространство, которое находит база данных.

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

если вы создаете вторичный индекс на HEAP таблицы RID (своего рода физический указатель на пространство хранения) используется в качестве указателя строки.

кластеризованный индекс означает, что записи являются частью B-Tree. При вставке записи B-Tree необходимо повторно подключить.

обновление строки в кластеризованной таблице вызывает повторную ссылку на B-дерево, i. e. обновление внутренних указателей в других записях.

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

это означает, что кластерный индекс должен быть уникальным. Если кластеризованный индекс не уникален, специальный скрытый столбец называется uniquifier добавляется к ключу индекса, который делает if уникальным (и больше по размеру).

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

создавая индекс в кластеризованной таблице, вы фактически всегда получаете составной индекс

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

индекс IX_mytable_5678 фактически является индексом для следующих столбцов:

col5
col6
col7
col8
col1
col2
col3
col4

это еще один побочный эффект:

A DESC условие в одноколоночном индексе кластеризованной таблицы имеет смысл в SQL Server

этот показатель:

CREATE INDEX IX_mytable ON mytable (col1)

можно использовать в таком запросе:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, в то время как этот:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

может использоваться в запросе, как это:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC

кучи-это просто таблицы без ключа кластеризации-без ключа, который обеспечивает определенный физический порядок.

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

в любом другом случае я настоятельно рекомендую использовать ключ кластеризации. SQL Server будет использовать первичный ключ в качестве ключа кластеризации по умолчанию - что является хорошим выбором в большинство случаев. Если вы не используете GUID (UNIQUEIDENTIFIER) в качестве первичного ключа, в этом случае использование этого в качестве ключа кластеризации-ужасная идея.

см Кимберли Трипп отличные сообщения в блоге GUID в качестве первичного и / или ключа кластеризации и Обсуждение Кластеризованного Индекса Продолжается для отличных объяснений, почему у вас всегда должен быть ключ кластеризации и почему GUID является ужасным ключом кластеризации.

моя рекомендация быть:

  • в 99% всех случаев попробуйте использовать INT IDENTITY в качестве первичного ключа и пусть SQL Server сделает этот ключ кластеризации также
  • исключение #1: Если вы массовая загрузка огромных объемов данных, вы можете быть в порядке без первичного ключа / кластеризации для вашей временной таблицы
  • исключение #2: Если вы должны использовать GUID в качестве первичного ключа, установите ключ кластеризации в другой столбец-предпочтительно INT IDENTITY - и я бы даже создал отдельный INT столбец только для этой цели, если никакой другой столбец не может быть использован

Марк


Книги Онлайн является лучшим источником!

весь компонент Database Engine-планирование и архитектура-архитектура таблиц и индексных структур данных очень хорошее внутреннее введение.

по этой ссылке вы можете скачать локальную копию книги онлайн(это бесплатно). Это лучшая (и официальная) ссылка на все вопросы Sql 2008.