Хранилище кучи не имеет ничего общего с этими кучами .
Куча просто означает, что сами записи не упорядочены (т.е. не связаны друг с другом).
Когда вы вставляете запись, она просто вставляется в свободное место, найденное базой данных.
Обновление строки в таблице на основе кучи не влияет на другие записи (хотя это влияет на вторичные индексы)
Если вы создаете вторичный индекс для таблицы 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