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