gpt4 book ai didi

c# - 数据库索引碎片 : Sequential GUID saved as String works fine but not saved as GUID

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:46 27 4
gpt4 key购买 nike

我们使用 GUID 作为主键(我们知道这不是一个好的选择,但现在不能改变)。众所周知,我们的索引很快就会碎片化。另一个用顺序 ID 替换 GUID 的好选择。为此,代码更改如下:

旧代码:

ObjectName.Id = Guid.NewGuid();

新代码:

ObjectName.Id = Sequential.NewGuid();

Sequential 是我们的静态类,它使用“rpcrt4.dll”创建 Sequential GUID。但我们的测试表明,这也不能很好地处理索引,而且它们会变得碎片化。

另一个有趣的发现是,如果我们将这个顺序 GUID 保存为数据库中的“字符串”,那么我们的索引就不会碎片化。

现在我有以下疑问/疑问:

  1. 当我们将相同的字符串保存为“String”和“GUID”时,为什么服务器的行为不同?据我目前的理解,它在内部将所有内容保存为字符串。

  2. 有什么方法可以配置数据库来告诉我们,将我们的 GUID 视为字符串并平等对待它们?

这里是环境的一些细节:

  • 数据库:SQLExpress
  • 编码语言:C#
  • 不能依赖服务器生成 key ,我们必须从代码本身设置 key 。

即使不是精确的解决方案,也欢迎指出解决方案。

最佳答案

guid 不存储为字符串。它存储为 16 个字节的数据 - guid 中的字符是字节的十六进制表示形式,其中第一对是最低有效值。

当 RPCRT4 生成连续的 GUID 时,它似乎将字节 4 视为最不重要的。这可能是您的索引变得支离 splinter 的原因。

尽管您的说法与此相反,但我还是建议您使用 SQL Server 的 NewSequentialID 函数。

关于c# - 数据库索引碎片 : Sequential GUID saved as String works fine but not saved as GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com