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

На заметке на полях ниже кода также сделает это полужирным.

<strong> text here </strong> 
28
задан Nipuna 13 May 2015 в 17:15
поделиться

3 ответа

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

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

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

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

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

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

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

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

Это означает, что кластеризованный индекс должен быть уникальным. Если кластеризованный индекс не уникален, специальный скрытый столбец, называемый 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

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

Условие 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
38
ответ дан 28 November 2019 в 03:17
поделиться

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

Ядро СУБД - Планирование и архитектура - Таблицы и архитектура структур индексных данных - очень хорошее внутреннее введение.

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

0
ответ дан 28 November 2019 в 03:17
поделиться

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

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

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

См. Kimberly Tripp '

11
ответ дан 28 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: