我们使用 GUID 作为主键(我们知道这不是一个好的选择,但现在不能更改)。众所周知,我们的索引很快就会碎片化。另一个用顺序 ID 替换 GUID 的好选择。为此,代码更改如下:
旧代码:
ObjectName.Id = Guid.NewGuid();
新代码:
ObjectName.Id = Sequential.NewGuid();
这里Sequential是我们的静态类,它使用“rpcrt4.dll”创建 Sequential GUID。但是我们的测试表明,这也不适用于索引,并且它们会变得支离破碎。
另一个有趣的发现是,如果我们将这个顺序 GUID 保存为数据库中的“字符串”,那么我们的索引就不会变得碎片化。
现在我有以下疑问/疑问:
当我们将相同的字符串保存为“String”和“GUID”时,为什么服务器的行为会有所不同?根据我到目前为止的理解,它在内部将所有内容保存为字符串。
有什么方法可以配置数据库来说明这一点,将我们的 GUID 视为字符串并平等对待它们?
以下是环境的一些细节:
- 数据库:SQLExpress
- 编码语言:C#
- 不能依赖服务器生成密钥,我们必须从代码本身设置密钥。
即使不是确切的解决方案,也欢迎提供解决方案的指针。