小编gdo*_*ica的帖子

GUID 上的聚集索引是否比非聚集索引产生更多的碎片?

我有一个简单的表:

CREATE TABLE [dbo].[UserTestGroups](
    [UserTestGroupId] [int] IDENTITY(1,1) NOT NULL,
    [Token] [nvarchar](100) NOT NULL,
    [TestId] [bigint] NOT NULL,
    [Group] [tinyint] NOT NULL,
    [InsertDate] [datetime] NOT NULL)
Run Code Online (Sandbox Code Playgroud)

该表将有相对大量的插入 - 最初 10,000 个会话,每个会话 8 行,每天总共 80,000 个插入。我们预计在不久的将来会显着增加。无论如何,我们努力使我们的平台尽可能具有弹性,而不仅仅是适应当前的负载。

该表将用于报告,可将其视为次要要求。

由于我们使用的是实体框架(Microsoft 的 ORM),因此所有写入的表都需要一个逻辑主键,因此我添加了一个我直接忽略的 Identity 列。我不喜欢使用复合键,它们往往会使 ORM 成为噩梦,所以除非我绝对必须这样做,否则我会添加另一个标识列并将其设为 PK。

所有 BI 报告的查询都将基于令牌,即sessionId - GUID,因此我在该token列上创建了聚集索引。

我们的 DBA 是 SQL Server MVP,他告诉我在 GUID 列上使用聚集索引会导致碎片,我应该在IDENTITY列上创建聚集索引,并为列创建非聚集索引Token

不明白,非聚集索引会不会有同样的碎片问题?为什么将数据复制到新索引中比使用聚集索引更好?

token-Guid 不是 PK,PK 是所有列的组合(包括InsertDate)。

目前(因为我真的不知道是什么原因)所有 GUID 值都存储为NVARCHAR(100),我不知道这样做的历史原因是什么,但这就是我们所拥有的。

我们的DBA在海外,我们的沟通是一条推特长,所以在他回来之前我无法得到正确的答案

sql-server clustered-index identity fragmentation sql-server-2014

2
推荐指数
1
解决办法
2857
查看次数