Подтвердить что ты не робот

Куча SQL Server v.s. кластеризованный индекс

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

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

спасибо заранее, Джордж

4b9b3361

Ответ 1

Хранилище кучи не имеет ничего общего с этими кучами.

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Моя рекомендация:

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

Марк

Ответ 3

Books Online - лучший источник!

Весь движок базы данных - планирование и архитектура - таблицы и структуры данных индексов. Архитектура - очень хорошее внутреннее введение.

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