SQL Server куча v.s. кластерный индекс - PullRequest
28 голосов
/ 27 августа 2009

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

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

спасибо заранее, George

Ответы [ 3 ]

38 голосов
/ 27 августа 2009

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

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

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

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

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

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

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

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

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

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

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

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

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

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

col5
col6
col7
col8
col1
col2
col3
col4

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

Условие 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
10 голосов
/ 27 августа 2009

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

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

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

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

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

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

Марк

0 голосов
/ 27 августа 2009

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

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

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

...