NewSequentialId в UniqueIdentifier Clustered Index

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

(ПРИМЕЧАНИЕ: я не хочу обсуждать плюсы и минусы использования UniqueIdentifier в качестве первичного ключа или кластерного индекса. В Интернете есть масса информации об этом. Это , а не то обсуждение.)

Итак, вот сценарий, который меня беспокоит:

Допустим, у меня есть таблица с UniqueIdentifier в качестве кластеризованного индекса и первичного ключа. Назовем это ColA. Я установил для ColA значение по умолчанию NewSequentialId ().

Используя этот NewSequentialId (), я вставляю три последовательные строки:

{72586AA4-D2C3-440D-A9FE-CC7988DDF065}
{72586AA4-D2C3-440D-A9FE-CC7988DDF066}
{72586AA4-D2C3-440D-A9FE-CC7988DDF067}

Затем я перезагружаю свой сервер. В документах для NewSequentialId говорится, что «После перезапуска Windows GUID может снова начаться с более низкого диапазона, но по-прежнему глобально уникален».

Таким образом, следующая начальная точка может быть ниже, чем предыдущий диапазон.

Итак, после перезапуска я вставляю еще 3 значения:

{35729A0C-F016-4645-ABA9-B098D2003E64}
{35729A0C-F016-4645-ABA9-B098D2003E65}
{35729A0C-F016-4645-ABA9-B098D2003E66}

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

Когда вы выполняете вставку в середине кластерного индекса, должно произойти повторное отображение индекса. (По крайней мере, так мне сказал мой администратор базы данных.) И каждый раз, когда я перезагружаюсь, я рискую, что мой новый диапазон UniqueIdentifier окажется прямо посередине других предыдущих диапазонов.

Итак, мой вопрос: со следующего набора UniqueIdentifier будет меньше, чем последний набор, каждая вставка будет вызывать перемешивание моего кластерного индекса?

А если нет, то почему? Знает ли SQL Server, что я использую NewSequentialId? Это каким-то образом компенсирует это?

Если нет, то как он узнает, что я вставлю дальше? Может быть, следующий миллион вставок начнется с 3. Или, может, они начнутся с 7. Откуда он знает?

Или не знает и просто держит все в порядке. Если это так, то одна перезагрузка может сильно повлиять на производительность. (Это заставляет меня думать, что мне нужен свой собственный NewSequentialId, на который не влияют перезагрузки.) Это правильно? Или есть какая-то магия, о которой я не подозреваю?

РЕДАКТИРОВАТЬ: GUID, поскольку кластерный индекс в моем стандарте категорически не рекомендуется. Как я сказал выше, есть много причин, по которым это плохая идея. Я пытаюсь выяснить, не является ли это другой причиной.

6
задан Vaccano 4 August 2011 в 16:53
поделиться