关于如何创建Sql服务器索引友好的Guid,有很多说明,例如this教程。另一个流行的方法是NHibernate实现中的一个(下面列出)。所以我认为编写一个实际测试这些代码的顺序需求的测试方法可能很有趣。但是我失败了 - 我不知道什么使得一个好的Sql服务器序列。我无法弄清楚他们是如何订购的。如何测试C#Sql服务器顺序GUID生成器?
例如,给出两种不同的方式来创建一个顺序guid,如何确定哪个是最好的(速度除外)?例如,它们看起来都有缺点,如果它们的时钟被设置回2分钟(例如时间服务器更新),它们的序列突然被破坏了?但这是否也意味着Sql服务器索引的麻烦?
我用这个代码产生连续的GUID:
public static Guid CombFromArticle()
{
var randomBytes = Guid.NewGuid().ToByteArray();
byte[] timestampBytes = BitConverter.GetBytes(DateTime.Now.Ticks/10000L);
if (BitConverter.IsLittleEndian)
Array.Reverse(timestampBytes);
var guidBytes = new byte[16];
Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 10);
Buffer.BlockCopy(timestampBytes, 2, guidBytes, 10, 6);
return new Guid(guidBytes);
}
public static Guid CombFromNHibernate()
{
var destinationArray = Guid.NewGuid().ToByteArray();
var time = new DateTime(0x76c, 1, 1);
var now = DateTime.Now;
var span = new TimeSpan(now.Ticks - time.Ticks);
var timeOfDay = now.TimeOfDay;
var bytes = BitConverter.GetBytes(span.Days);
var array = BitConverter.GetBytes((long)(timeOfDay.TotalMilliseconds/3.333333));
Array.Reverse(bytes);
Array.Reverse(array);
Array.Copy(bytes, bytes.Length - 2, destinationArray, destinationArray.Length - 6, 2);
Array.Copy(array, array.Length - 4, destinationArray, destinationArray.Length - 4, 4);
return new Guid(destinationArray);
}
从文章的一个稍快,但它创建的SQL服务器的最佳顺序?我可以填充100万条记录并比较碎片,但我甚至不知道如何正确验证。无论如何,我想了解如何编写一个测试用例来确保序列是由Sql server定义的序列!
另外我想对这两个实现的一些意见。是什么让一个比另一个更好?
难道你不过早地优化? –
在SQL Server 2012序列将能够做到这一点,很可能会比你自己写的任何东西更有效 – jaypeagi
@jaypeagi有趣的想法,但我猜他们为什么首先使用GUID是为了它可以应用程序生成的火灾和忘记插入。使用序列意味着序列将不得不从真值源(SQL)中查询。如果序列可以工作,我很好奇为什么一个正常的身份列不会工作(更快!) –