我们有一个遗留数据库,它是一个 sql server db(2005 和 2008)。
表中的所有主键都是唯一标识符。
这些表目前没有在它们上创建聚集索引,并且我们在只有 750k 记录的表上遇到了性能问题。这是我使用的第一个使用唯一标识符作为唯一主键的数据库,我从未见过 sql server 在返回数据时如此缓慢。
我不想在 uniqueidentifier 上创建聚集索引,因为它们不是顺序的,因此在插入数据时会减慢应用程序的速度。
我们无法删除用于远程站点记录身份管理目的的唯一标识符。
我曾考虑向表中添加一个大整数标识列,并在该列上创建聚集索引并包括唯一标识符列。
IE
int identity - 保持插入速度的第一列唯一标识符 - 确保应用程序按预期工作。
目标是提高标识查询和联接表查询性能。
Q1:这会提高数据库的查询性能还是会减慢它的速度?
Q2:有没有我没有列出的替代品?
谢谢皮特
编辑: 性能问题是通过选择语句快速检索数据,特别是如果一些更多的“事务/更改”表连接在一起。
编辑2:表之间的连接通常都在主键和外键之间,对于具有外键的表,它们包含在非聚集索引中以提供更多覆盖索引。
这些表都没有其他可以提供良好聚集索引的值。
我更倾向于在每个高负载表上添加一个额外的标识列,然后在聚集索引中包含当前的 Guid PK 列以提供最佳查询性能。
编辑 3:我估计 80% 的查询是通过数据访问机制单独对主键和外键执行的。通常,我们的数据模型具有延迟加载的对象,这些对象在访问时执行查询,这些查询使用对象 id 和 PK 列。我们有大量用户驱动的数据排除/包含查询,它们使用外键列作为过滤器,基于类型 X 的标准排除以下 id。剩下的 20% 是枚举 (int) 或日期范围列的 where 子句,系统中执行的基于文本的查询很少。
在可能的情况下,我已经添加了覆盖索引来覆盖最重的查询,但到目前为止我仍然对性能感到失望。正如 bluefooted 所说,数据被存储为堆。