由于我们最近遇到的一些数据库问题,我一直在查看索引的状态并尝试减少碎片。
该应用程序有几个名称表,例如 BoysNames 和 GirlsNames,我们使用它们来设置我们创建的 User 对象的属性。这里最明显的属性是 Gender。这些表可以有几百到 10,000 行。
这些表的结构如下:
Name - nvarchar(50) - PK & Clustered Index
DateCreated - datetime
当我告诉 Sql Server 重新组织或重建我所有表上的索引时,大多数表碎片下降到 0%,但其中一些 Name 表立即碎片化了 50%。
我只在 2 个地方访问这些表:
- 第一个是当我从表中选择每个名称并将其存储在内存中以针对进入系统的新用户使用,这样我就可以执行以下操作: if (boysNames.Contains(user.Name)) {user.Gender = "米"}; 这种情况经常发生。
- 第二个是当我向列表中添加新名称时,我检查名称是否存在,如果它不存在,我添加它。这种情况很少发生。
所以我需要知道的是:
这种高度的碎片化会给我带来问题吗?在重组/重建后直接将索引碎片设置为 50% 时,如何将索引碎片减少到 0%?
我应该使用 int 作为主键并在 Name 上放置索引,还是 nvarchar 是主键的正确选择?