如何有顺序的生成GUID
想用Guid做表的主键,并在此字段上建立聚簇索引。 因为Guid是随机生成的,生成的值大小是不确定的,每次生成的数可能很大,也可能很小。这样会影响插入的效率,在网上看到有一种方法可以生成顺序的GUID,称为COMB, 描述是这样的:
--------------------------------------------------------------------
使用“COMB(Combine)”类型
COMB数据类型的基本设计思路是这样的:保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:
DECLARE @aGuid UNIQUEIDENTIFIER
SET @aGuid = CAST(CAST(NEWID() AS BINARY(10))
+ CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
经过测试,使用COMB做主键比使用INT做主键,在检索、插入、更新、删除等操作上仍然显慢,但比Unidentifier类型要快上一些。
------------------------------------------------------------------------------------------------------
对于上面的实现方法在很多网站都有描述,国外的英文文章也是这样说的(估计都是从中文翻译过来的)。
但这里我有一个疑问, 上面说保留 GUID 的前10个字节,然后用当前时间作为后6个字节,组合一个新的GUID。 这样做还是没有顺序啊? 因为前10个字节有时大有时小啊。 但我搜了半天,没有人对此提出异议。我想如果把时间的6个字节加在前面是不是可以呢? 像下面这样:
DECLARE @aGuid UNIQUEIDENTIFIER
SET @aGuid = CAST(
CAST(GETDATE() AS BINARY(6))
+ CAST(NEWID() AS BINARY(10))
AS UNIQUEIDENTIFIER)
测试了一下,结果不理想,因为后面的10个字节大小不是顺序的,相加依然不是顺序的。
难道是我误入歧途了吗? 谁能指点一下啊。 谢谢了。