唯一标识符策略

时间:2012-04-28 16:53:45

标签: c# nhibernate int guid

我将使用带有nhibernate orm层的c#和mssql数据库,我试图找出哪种方法在生产中使用会更快。

据我所知,Guids占用的空间比整数多出4倍,16对4字节。

数据同步将非常频繁。这是一个棘手的主题,因为糟糕的方法可能会导致大量的内存消耗。使用整数可以导致更快的响应,但每次数据插入都必须命中数据库才能从序列中获取值。

那么,我应该在mssql内部使用带有标识的整数方法,还是在标识列的nhibernate映射中使用HiLo生成器?

我是否会使用guids遇到性能问题?

1 个答案:

答案 0 :(得分:2)

比较32位数据类型(4字节int)与比较128位数据类型(guid)之间的性能可能非常小。我没有任何数字,最大的因素是128位数据类型将占用多个寄存器而不是较小的数据类型。由于我们正在向64位架构设备发展,因此在比较时,guid将采用两个寄存器而不是一个寄存器。

尽管如此,我宁愿使用基于问题要求的可维护策略,而不是尝试优化32位或128位标识符。

由于您声明其中一个要求是同步数据库,因此首选guid而不是递增的int。如果使用递增的int,则基本上需要确保在插入之前,在另一个数据库中没有“获取”递增的int。

当然,您可以为此制定一些策略,例如每个客户端仅在该范围的特定子集中生成,但这已经通过使用guid来实现。由于它的大小以及它的创建方式,每个客户端都可以创建一个guid,其中很少有人能够被其他人复制。

因此,重新说一下,我建议使用Guid