1

Я борюсь за понимание того, что такое кластерный индекс в SQL Server 2005. Я прочитал статью MSDN Clustered Index Structures (между прочим), но я все еще не уверен, правильно ли я ее понимаю.Кластерный индекс SQL Server: (физический) Порядок данных

Вопрос (основной): Что произойдет, если я вставляю строку (с «низким» ключом) в таблицу с кластеризованным индексом?

Упомянутые выше MSDN статья гласит:

Страница в цепочке данных и строки в них упорядочены по значению кластерного ключа индекса.

И Using Clustered Indexes к примеру гласит:

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

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

Или это скорее (как я подозреваю), что есть два сценария в зависимости от того, как «полная» первая страница данных.

  • A) Если страница имеет достаточно свободного места для размещения записи она помещается в существующую страницу данных и данные могут быть (физически) переупорядоченный в пределах этой страницы.
  • B) Если на странице не хватает свободного места для записи, будет создана новая страница данных (в любом месте на диске!) и «привязана» к передней части уровня листа B-Tree?

Это означает, что «физический порядок» данных ограничивается «уровнем страницы» (т. Е. На странице данных), но не на страницах, находящихся на последовательных блоках на физическом жестком диске. Страницы данных затем просто соединяются вместе в правильном порядке.

Или сформулировано альтернативным способом: если SQL Server должен прочитать первые N строк таблицы с кластеризованным индексом, он может последовательно читать страницы данных (по ссылкам) , но эти страницы не являются (обязательно) блоком мудрый последовательно на диске (так что голова диска должна перемещаться «случайно»).

Как близко я? :)

ответ

3

Если вы случайно вставить строку с «низким» ID, как вы говорите, то да - он будет помещен в непосредственной близости от ваших других строк, которые уже существуют с похожими идентификаторами.

Если ваша страница SQL Server (8K chunks) заполнена до максимального значения, то произойдет разбиение страницы на - половина строк останется на этой странице, а другая половина будет перемещена на новую страницу. Теперь у этих двух новых страниц будет некоторая емкость для новой строки.

Это одна из причин, по которой вы не хотите использовать что-то в качестве ключа кластеризации, который является очень случайным, например. GUID, который приведет к тому, что строки будут вставлены по всему месту.

Попытка избежать разрывов страниц (которые являются довольно дорогостоящими операциями) является одной из основных причин, почему гуру, например, Kimberly Tripp heavily advocate using something that is ever increasing в качестве ключа кластеризации - например, столбец INT IDENTITY. Здесь всегда гарантируется, что новое значение будет больше, чем все, что уже есть в вашей базе данных, поэтому новые строки всегда добавляются на «конце» пищевой цепи.

Для получения более подробной информации о форексе см. Блог Кимберли Триппса - особенно ее категория Clustering Key!

 Смежные вопросы

  • Нет связанных вопросов^_^