Благодаря замечательной статье Стоимость GUID в качестве первичных ключей , у нас есть COMB GUID. Исходя из текущей реализации, существует 2 подхода:
- используйте последние 6 байтов для отметки времени: GUID как быстрые первичные ключи в нескольких базах данных
- используйте последние 8 байтов для метки времени с помощью тика Windows: Стратегия GUID COMB в EF4.1 (CodeFirst)
Все мы знаем, что для 6-байтовой отметки времени в GUID было бы больше байтов для случайных байтов, чтобы уменьшить коллизию GUID. Однако будет создано больше GUID с той же меткой времени, и они вообще не будут последовательными. При этом предпочтительнее использовать метку времени 8 байтов.
Так что это кажется трудным выбором. На основании статьи выше GUID как быстрые первичные ключи в нескольких базах данных, в нем говорится:
Прежде чем мы продолжим, сделаем короткую сноску об этом подходе: использование временной метки с разрешением 1 миллисекунда означает, что GUID, сгенерированные очень близко друг к другу, могут иметь одинаковое значение временной метки, и поэтому не будут последовательными. Это может быть обычным явлением для некоторых приложений, и на самом деле я экспериментировал с некоторыми альтернативными подходами, такими как использование таймера с более высоким разрешением, такого как System.Diagnostics.Stopwatch, или объединение отметки времени со «счетчиком», который гарантировал бы последовательность продолжалось до обновления метки времени. Однако во время тестирования я обнаружил, что это вообще не имело заметной разницы, даже когда десятки или даже сотни GUID генерировались в одном и том же окне длительностью в одну миллисекунду. Это согласуется с тем, с чем столкнулся Джимми Нильссон во время тестирования COMB.
Просто интересно, может ли кто-нибудь, кто знает внутреннюю базу данных, поделиться некоторыми сведениями о вышеупомянутом наблюдении. Это потому, что этот сервер базы данных просто хранит данные в памяти и записывает на диск только тогда, когда он достигает определенного порога? Таким образом, изменение порядка вставленных данных с непоследовательным GUID с той же меткой времени обычно происходит в памяти и, таким образом, минимальное снижение производительности.
Обновление: на основании нашего тестирования, COMB GUID не смог уменьшить фрагментацию таблицы, поскольку это заявлено через Интернет, по сравнению со случайным GUID. Кажется, что сейчас единственный способ - использовать SQL Server для генерации последовательного GUID.
newsequentialid()
(из @ErikE ниже). - person Greenstone Walker   schedule 14.03.2014