Кластерный индекс SQL Server: (физический) порядок страниц данных - PullRequest
1 голос
/ 28 апреля 2010

Мне трудно понять, что такое кластеризованный индекс в SQL Server 2005. Я прочитал статью MSDN Структуры кластерного индекса (среди прочего), но я все еще не уверен, правильно ли я понимаю.

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

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

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

И Использование кластерных индексов , например, состояния:

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 28 апреля 2010

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

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

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

Попытка избежать разбиения страницы (что является довольно дорогостоящей операцией) является одной из основных причин, по которой гуру, такие как Кимберли Трипп, настоятельно рекомендуют использовать в качестве ключа кластеризации то, что постоянно увеличивается , например столбец INT IDENTITY. Здесь всегда гарантируется, что новое значение будет больше, чем то, что уже есть в вашей базе данных, поэтому новые строки всегда добавляются в «конец» пищевой цепи.

Более подробную справочную информацию можно найти в блоге Кимберли Триппса, особенно в ее ключе кластеризации категории!

2 голосов
/ 28 апреля 2010

Как близко ты? Очень!

Эти статьи могут помочь закрепить ваше понимание:

http://msdn.microsoft.com/en-us/library/aa964133(SQL.90).aspx

http://www.sql -server-performance.com / статьи / в / index_fragmentation_p1.aspx

...