Куча SQL Server v.s. кластеризованный индекс
Я использую SQL Server 2008. Я знаю, что таблица не имеет кластерного индекса, тогда она называется кучей, или же модель хранения называется кластеризованным индексом (B-Tree).
Я хочу узнать больше о том, что именно означает хранилище кучи, как оно выглядит и организовано ли оно как структура данных "кучи" (например, минимальная куча, максимальная куча). Любые рекомендуемые показания? Я хочу больше немного внутренних, но не слишком глубоких.: -)
спасибо заранее,
Джордж
Ответы
Ответ 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.