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