0

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

据我所知,Guids 占用的空间是 ints 占用 16 对 4 个字节的空间的 4 倍。

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

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

我是否会遇到使用指南的性能问题?

4

1 回答 1

2

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

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

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

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

所以,换个说法,我建议使用 Guid

于 2012-04-28T18:50:15.303 回答