2012-04-28 139 views
0

我打算在nhibernate orm层中使用c#和mssql数据库,并且试图确定在生产中使用哪种方法会更快。唯一标识符策略

据我所知,Guids需要4倍多的空间而不是16个对4个字节。

数据的同步将会频繁发生。这是一个棘手的问题,因为坏的方法会导致大量的内存消耗。使用整数可以引起更快的响应,但每次数据插入必须通过数据库才能从序列中获取值。

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

我会不会遇到使用GUID的性能问题?

+2

性能是非常小的。我宁愿使用可维护策略,而不是使用32位或128位标识符进行微型优化。既然你想同步数据,一个guid而不是递增的int会更好,因为如果你使用一个int,你基本上需要确保在插入之前增量的int在另一个数据库中不被“取用”。 – Patrick 2012-04-28 17:55:26

+0

好的,应该使用guid。谢谢。如何接受你的答案? – Grunf 2012-04-28 18:06:19

+0

我可以让它成为答案..给我一分钟.. – Patrick 2012-04-28 18:37:39

回答

2

比较32位数据类型(4字节int)而不是比较128位数据类型(guid)的性能可能非常小。我没有任何数字,最大的原因是128位数据类型会占用多个寄存器,而不是较小的数据类型。由于我们正朝着64位体系结构迈进,因此比较时,guid将采用两个寄存器而不是一个。

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

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

当然,你可以有一些这样的策略,比如每个客户端只生成一个特定的范围子集,但这已经通过使用一个GUID来覆盖。由于它的大小以及它的创建方式,每个客户都可以创建一个guid,而其他人可能会重复该guid。

因此,要改一下,我会建议使用,而不是比较一个GUID比较一个int之间的Guid